如何按列对2个列表列表进行排序?

时间:2015-09-07 22:39:47

标签: python list sorting

我有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])

但它仅适用于一个列表列表。

4 个答案:

答案 0 :(得分: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])]

作为我们的中间结构。

答案 1 :(得分:0)

装饰,排序,不装饰。

contentSize

答案 2 :(得分:0)

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

  1. 排序a,然后排序b,然后将子列表交错:
  2. 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,将它们添加到一起,对结果进行排序,并取消修改结果:
    2. 在[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]]
      

答案 3 :(得分:0)

使用以下简单代码-

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