【问题标题】:How can I sort 2 lists of lists by column?如何按列对 2 个列表列表进行排序?
【发布时间】:2015-12-03 11:49:49
【问题描述】:

我有 2 个列表:

a=[['abc',2, 'cde'],
   ['xyz',5, 'fgh']]


b=[['abc', 'lmn', 2],
   ['xyz','opq',5]]

我想得到这样的列表的结果列表:

result = [['abc',2, 'cde'],
          ['abc', 'lmn', 2],
          ['xyz',5, 'fgh'],
          ['xyz','opq',5] ]

列表结果按第一个列表的第二列和第二个列表的第三列排序。

我在这里查过:Python: sorting a list by "column"这个代码:

sorted(a, key=lambda x: x[0])

但它仅适用于一个列表。

【问题讨论】:

  • 合并两个列表并使用您为单个列表找到的解决方案如何?

标签: python list sorting


【解决方案1】:

一种方法——不一定是最优雅但最有效的——是将给定行来自哪个列表(a 或 b)的信息添加到中间结构,因此我们知道是使用 col #1 还是 # 2.例如:

decorated = [(i,row) for i,lol in enumerate([a,b]) for row in lol]
new_lol = sorted(decorated, key=lambda x: x[1][1 if x[0]==0 else 2])
new_lol = [x[1] for x in new_lol]

这给了

>>> new_lol
[['abc', 2, 'cde'], ['abc', 'lmn', 2], ['xyz', 5, 'fgh'], ['xyz', 'opq', 5]]

因为我们有什么是有效的

>>> decorated
[(0, ['abc', 2, 'cde']), (0, ['xyz', 5, 'fgh']), (1, ['abc', 'lmn', 2]), (1, ['xyz', 'opq', 5])]

作为我们的中间结构。

【讨论】:

  • 我有 2 个 2600 行的列表(即行。[931010867.0, 9061000.0, 'EA', '672.63', 21000.0, '22.00', '147.98', 10.0, '167.37.00 ', '', 'SC', 9061000.0, 'RENASYS GO NOLEGGIO GIONALIERO'] 当我运行你的代码时,python 崩溃了!行太多了?
【解决方案2】:

装饰、分类、取消装饰。

>>> [z[1] for z in sorted([(x[1], x) for x in a] + [(y[2], y) for y in b], key=operator.itemgetter(0))]
[['abc', 2, 'cde'], ['abc', 'lmn', 2], ['xyz', 5, 'fgh'], ['xyz', 'opq', 5]]

【讨论】:

    【解决方案3】:

    我看到你的问题有两种解释:

    1. 排序a,然后排序b,然后将子列表交错在一起:

    In [14]: a=[['abc',2, 'cde'],
       ....:    ['xyz',5, 'fgh']]
    
    In [15]: b=[['abc', 'lmn', 2],
       ....:    ['xyz','opq',5]]
    
    In [16]: a.sort(key=operator.itemgetter(1))
    
    In [17]: b.sort(key=operator.itemgetter(2))
    
    In [18]: result = [list(i) for i in zip(a,b)]
    
    In [19]: result
    Out[19]: 
    [[['abc', 2, 'cde'], ['abc', 'lmn', 2]],
     [['xyz', 5, 'fgh'], ['xyz', 'opq', 5]]]
    
    1. 修改ab,将它们相加,排序结果,取消修改结果:

    在[20]中:a=[['abc',2,'cde'], ['xyz',5, 'fgh']]

    In [21]: b=[['abc', 'lmn', 2],
       ['xyz','opq',5]]
    
    In [22]: a = [[0]+i for i in a]
    
    In [23]: b = [[1]+i for i in b]
    
    In [24]: result = sorted(a+b, key=lambda s: s[3] if s[0] else s[2])
    
    In [25]: result
    Out[25]: 
    [[0, 'abc', 2, 'cde'],
     [1, 'abc', 'lmn', 2],
     [0, 'xyz', 5, 'fgh'],
     [1, 'xyz', 'opq', 5]]
    
    In [26]: result = [s[1:] for s in sorted(a+b, key=lambda s: s[3] if s[0] else s[2])]
    
    In [27]: result
    Out[27]: [['abc', 2, 'cde'], ['abc', 'lmn', 2], ['xyz', 5, 'fgh'], ['xyz', 'opq', 5]]
    

    【讨论】:

      【解决方案4】:

      使用下面的简单代码-

      templist = []
      for i in range(len(a)):
          templist.append(a[i])
          templist.append(b[i])
      print(templist)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-31
        • 1970-01-01
        • 2021-04-21
        • 1970-01-01
        相关资源
        最近更新 更多