2014-01-10 128 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']]