通过“列”按字母顺序对python中的列表列表进行排序

时间:2014-01-10 21:30:33

标签: python list sorting lambda 2d

我有一个像

这样的二维字符列表
 [['J', 'A', 'M', 'E', 'S'],
 ['F', 'C', 'A', 'A', 'A'],
 ['F', 'A', 'B', 'B', 'B']]

按字母顺序对第一个列表进行排序的最佳方法是什么,其中包括以下进程列表,即:

[['A', 'E', 'J', 'M', 'S'],
['C', 'A', 'F', 'A', 'A'],
['A', 'B', 'F', 'B', 'B']]

3 个答案:

答案 0 :(得分:5)

您可以使用zip()

>>> [list(t) for t in zip(*sorted(zip(*s)))]
[['A', 'E', 'J', 'M', 'S'], ['C', 'A', 'F', 'A', 'A'], ['A', 'B', 'F', 'B', 'B']]

其中s是您的列表清单。

答案 1 :(得分:1)

>>> l = [['J', 'A', 'M', 'E', 'S'],
...  ['F', 'C', 'A', 'A', 'A'],
...  ['F', 'A', 'B', 'B', 'B']]
>>> zip(*sorted(zip(*l)))
[('A', 'E', 'J', 'M', 'S'), ('C', 'A', 'F', 'A', 'A'), ('A', 'B', 'F', 'B', 'B')]

如果您需要结果中的列表:

>>> map(list, zip(*sorted(zip(*l))))
[['A', 'E', 'J', 'M', 'S'], ['C', 'A', 'F', 'A', 'A'], ['A', 'B', 'F', 'B', 'B']]

答案 2 :(得分:1)

其他答案展示了如何在一行中完成。这个答案说明了这是如何工作的:

给定listl

In [1]: l =  [['J', 'A', 'M', 'E', 'S'],
   ...:  ['F', 'C', 'A', 'A', 'A'],
   ...:  ['F', 'A', 'B', 'B', 'B']]

将列分为tuple,将每行传递到zip()

In [2]: zip(*l)
Out[2]: 
[('J', 'F', 'F'),
 ('A', 'C', 'A'),
 ('M', 'A', 'B'),
 ('E', 'A', 'B'),
 ('S', 'A', 'B')]

对此list的{​​{1}}进行排序:

tuple

请注意,如果第一个列表包含重复项,则此排序不是稳定排序。

再次转置In [3]: sorted(zip(*l)) Out[3]: [('A', 'C', 'A'), ('E', 'A', 'B'), ('J', 'F', 'F'), ('M', 'A', 'B'), ('S', 'A', 'B')] 以获得listliststuple

In [4]: zip(*sorted(zip(*l)))
Out[4]: 
[('A', 'E', 'J', 'M', 'S'),
 ('C', 'A', 'F', 'A', 'A'),
 ('A', 'B', 'F', 'B', 'B')]

使用list comprehensionlist的{​​{1}}转换回tupleslist

list