【问题标题】:Sorting and Grouping Nested Lists Consists of Class Objects对由类对象组成的嵌套列表进行排序和分组
【发布时间】:2016-12-13 20:28:27
【问题描述】:

我有数百个需要根据用户名和日期解析的文本文件。我试图将有用的数据放在列表中的文本文件中:

    [
      ['1234245@gmail.com', '34209809' '1434546354', '2016-07-18 00:20:58'], 
      ['abcd@gmail.com', '234534345', '09402380',, '2016-07-18 00:20:03'], 
      ['username@gmail.com', '345315531','1098098098', '2016-07-18 02:40:00'], 
      ['abcd@gmail.com', '345431353', '231200023', '2016-07-18 15:45:49'], 
      ['1234245@gmail.com', '23232424', '234809809', '2016-07-18 20:45:40']
    ]

但是,我想根据日期时间对它们进行排序并按用户名分组,因此输出将如下所示:

    [
     ['1234245@gmail.com', '23232424', '234809809', '2016-07-18 20:45:40'],
     ['1234245@gmail.com', '34209809' '1434546354', '2016-07-18 00:20:58'],
     ['abcd@gmail.com', '345431353', '231200023', '2016-07-18 15:45:49'],
     ['abcd@gmail.com', '234534345', '09402380',, '2016-07-18 00:20:03'],
     ['username@gmail.com', '345315531','1098098098', '2016-07-18 02:40:00']
    ]

这是我的代码:

    import glob
    from operator import itemgetter
    from itertools import groupby
    def read_large_file(filename):
        matrix=[]
        global username
        username=[]
        for myfile in glob.glob(filename):
            infile = open(myfile, "r")
            for row in infile:
                row=row.strip()
                array=row.split(';') 
                username.append(array[9])
                matrix.append(cdr(array[9],array[17],array[18],array[8]))

        return matrix


    class cdr(object):               
        def__init__(self,username,total_seconds_since_start,download_bytes,date_time):
            self.username=username
            self.total_seconds_since_start=total_seconds_since_start
            self.download_bytes=download_bytes
            self.date_time=date_time


    def GroupByUsername(matrix):
        new_matrix=[]
        new_matrix=groupby(matrix, itemgetter(0))
        return new_matrix

    matrix=read_large_file('C:\Users\ceren\.spyder2/test/*')
    matrix_new=GroupByUsername(matrix)

我尝试使用此链接中的解决方案:Sorting and Grouping Nested Lists in Python 但是我遇到了这些错误:

   'cdr' object does not support indexing
   'cdr' object is not iterable

【问题讨论】:

    标签: python list sorting object grouping


    【解决方案1】:

    您或许可以只使用简单的 Python 内置排序。

    sorted_list = sorted(data, key=lambda user_info: (user_info[0], user_info[3]))
    

    lambda 键告诉 Python 如何对列表进行排序(升序)。对于data 中的每个条目,user_info 将是 4 个属性的列表。因此,user_info[0] 将是电子邮件,user_info[3] 将是日期时间。

    【讨论】:

    • 谢谢你,我试过了,但是我得到了这个错误:TypeError: () 只需要 1 个参数(给定 2 个)
    • 抱歉,我忘记了key=。我已经修好了 - 试试看 :)
    • 还有这个:TypeError: 'cdr' object does not support indexing ,我认为python不允许我将类对象放入列表索引中。
    • 如果你想准确地复制输出,你会想要像 sorted(sorted(data, key=lambda x: x[-1], reverse=True), key=lambda x:x[0]) 这样的东西,因为 Timsort 是稳定的。
    • 我给出的解决方案会对你提供的嵌套列表进行排序。要对 cdr 对象列表进行排序,您需要:sorted_list = sorted(cdr_list, key=lambda cdr: (cdr.username, cdr.date_time))
    猜你喜欢
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多