2014-01-10 55 views
1

我有人物像排序在Python列表名单按字母顺序“列”

[['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']] 
+1

会有什么如果第一个列表是'['J','M','M','E','S']',那么期望的输出是? –

回答

1

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

给定一个listl

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

集团列到tuple S,通过将每行到zip()

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

排序tuplelist s:

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

请注意,如果第一个列表包含重复的项目,那么这种排序并不稳定。

再次转置list拿到三liststuple的S:

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

转换的tupleslistlistlist一个S,使用list comprehension

In [5]: [list(t) for t in zip(*sorted(zip(*l)))] 
Out[5]: 
[['A', 'E', 'J', 'M', 'S'], 
['C', 'A', 'F', 'A', 'A'], 
['A', 'B', 'F', 'B', 'B']] 
+1

你可以通过使用'sorted(zip(* 1),key = operator.itemgetter(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是您的列表清单。

+0

拉链仍然是魔术,就我而言...... –

+0

请注意,如果第一个列表包含重复的项目,那么这种排序并不稳定。 –

+0

@adsmith:对于像'zip'这样的任务,如果你认为它可以被称为“转置”,那么它更有意义。 –

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']]