【问题标题】:Uniquely sorting a list of lists in Python在 Python 中对列表列表进行唯一排序
【发布时间】:2012-07-16 15:15:10
【问题描述】:

我有一个列表列表 -

super_list = [seconds, self.flowdata, key]

其中 seconds 是一个十位数字,self。 flowdata 是一个包含 160 个整数的列表,而 key 是一个标识字符串。打印 super_list 会产生以下结构的多次迭代,都具有不同的值,

示例:

"[[1509321600], 
  ['1', '-1', '4', '7', '7', '1', '-8', '-14', '-24', '-29', '-25', '-24', '-9', '-4', '0', '0', '-5', '-10', '-6', '-5', '7', '-4', '-4', '-11', '5', '3', '9', '5', '3', '3', '6', '-6', '-8', '-6', '-6', '25', '23', '30', '22', '13', '-7', '0', '-1', '-18', '-24', '-28', '-24', '-24', '-18', '-14', '-14', '-12', '-13', '-11', '-15', '-16', '-8', '-3', '-4', '-2', '11', '29', '38', '40', '41', '29', '34', '25', '20', '15', '31', '22', '16', '2', '8', '21', '39', '43', '45', '38', '39', '37', '38', '41', '43', '42', '38', '34', '34', '25', '25', '29', '18', '23', '27', '26', '18', '15', '15', '11', '17', '10', '11', '4', '-3', '-12', '-17', '-14', '6', '5', '13', '4', '-21', '-22', '-16', '-12', '-6', '4', '16', '9', '17', '16', '16', '16', '15', '12', '12', '7', '-2', '-12', '-13', '-5', '-7', '-8', '-12', '-15', '-14', '-11', '-8', '-1', '-1', '-3', '-12', '-7', '-6', '-7', '5', '4', '2', '3', '1', '0', '-12', '-12', '-13', '-17', '-18', '-18', '-15', '-13', '-13', '-16', '-17', '-18', '-18', '-19', '-16', '-13'], 
  '1441-4731-1-10/30/2017']

每组(或您喜欢的行,如上所示)秒、流数据和键都是相关的。

我想对 super_list 进行排序,以使秒数从小到大排序,而且还与其相关的 flowdata 和 key 在 super_list 中的同一数字“行”中。

即假设上面的示例是排序列表中的第一个(1509321600 是秒列表中的最小秒数),上面的 flowdata 也将是 flowdata 中的第一个,上面的 key "1441-4731-1-10/ 30/2017" 将是第一个键。

帮助?

【问题讨论】:

    标签: python list sorting large-data


    【解决方案1】:

    假设您的列表如下所示:[[seconds1, flowdata1, key1], [seconds2, flowdata2, key2], ...]:

    只需使用super_list.sort()

    这将按字典(从左到右)顺序对字段进行排序。因为seconds是最左边的字段,所以所有条目都会按它排序。

    您还可以通过使用key参数到sort,按特定字段排序,例如:

    super_list.sort(key=lambda row: row[0]) #sort by seconds field
    

    【讨论】:

    • 我试过这样做,但是当我得到以下错误时 super_list = [seconds, self.flowdata, key] print super_list.sort(key=lambda row: row[0]) 'int ' object not iterable 或 'int' object unsubsrictpable 或程序确实运行并且我一遍又一遍地重复'None'。
    • @user1532369: 1. super_list 应该是一个列表列表,但你只有一个列表代表一行。对单行进行排序没有意义。 2. super_list.sort() 不返回值,它只是重新排列列表。如果您想在不更改原始列表的情况下获得排序列表,请改用sorted(super_list)
    • 因为我有这个结构 "[[1509321600], ['1', '-1', '4', '7', '7', '1', '-8 ','-14','-24','-29','-25','-24','-9','-4','0','0','-5', '-10', '-6', '-5', '-13'], '1441-4731-1-10/30/2017']" 重复了很多次。你知道我怎么能把它改成这种格式[[seconds1,flowdata1,key1],[seconds2,flowdata2,key2],...]:如上所述,所以我可以对其进行排序?
    • 对不起,我的意思是这个结构 "[1509321600, ['1', '-1', '4', '7', '7', '1', '-8', '- 14'、'-24'、'-29'、'-25'、'-24'、'-9'、'-4'、'0'、'0'、'-5'、'-10' , '-6', '-5', '-13'], '1441-4731-1-10/30/2017'] "
    • @user1532369:这应该可行,具体取决于您所说的“重复多次”。对于两个项目,它应该看起来像 [[12345, ['1','2','3'], 'abc-def-ghi'], [23456, ['4','5','6'], 'qwe-rty-uio']]
    【解决方案2】:

    您可以将列表压缩成一个元组,然后对元组列表进行排序,然后使用列表推导解包元组,如下所示:

    super_list = [seconds, flowdata, key for zipped_tuple in sorted(zip(super_list[0], super_list[1], super_list[2]))]
    

    其中 seconds、flowdata、key 和 zipped_tuple 是任意名称,没有超出列表理解范围的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 1970-01-01
      • 2023-01-11
      • 2016-06-11
      • 2018-04-17
      • 1970-01-01
      相关资源
      最近更新 更多