2012-01-05 171 views
0

我有一個嵌套列表看起來像這樣:基於兩個不同列表項目和重新排序/重新排序的多項目排序?

li = [['m', 'z', 'asdgwergerwhwre'], 
     ['j', 'h', 'asdgasdgasdgasdgas'], 
     ['u', 'a', 'asdgasdgasdgasd'], 
     ['i', 'o', 'sdagasdgasdgdsag']] 

我想按字母順序排序此列表,但使用無論是在每個子列表中的第一個或第二個元素。對於上面的示例,期望的輸出將是:

['a', 'u', 'asdgasdgasdgasd'] 
['h', 'j', 'asdgasdgasdgasdgas'] 
['i', 'o', 'sdagasdgasdgdsag'] 
['m', 'z', 'asdgwergerwhwre'] 

實現此類排序的最佳方法是什麼?

+1

它不只是排序,但內在轉變 – 2012-01-05 19:29:03

回答

1

當我們進行一些改造的第一步(交換了前兩個項目 - 如果需要的話),並在第二aplly簡單梳理:

>>> sorted(map(lambda x: sorted(x[:2]) + [x[2]], li)) 
[['a', 'u', 'asdgasdgasdgasd'], 
['h', 'j', 'asdgasdgasdgasdgas'], 
['i', 'o', 'sdagasdgasdgdsag'], 
['m', 'z', 'asdgwergerwhwre']] 
+0

謝謝。我的排序非常大,所以我最終使用了你的代碼並重構了一個理解,這加快了它的速度:'x = sorted(sorted(x [:2])+ x [2] ' – drbunsen 2012-01-05 23:13:04

1

您可以使用內置方法sorted()來完成其中的一些操作。如果你想扭轉它的打印方式,你將不得不扭轉列表的順序,但這並不難。

def rev(li): 
    for l in li: 
     l[0], l[1] = l[1], l[0] 
    return li 

new_list = sorted(rev(li)) 

如果你想排序基於特定的索引列表,你可以使用sorted(li, key=lambda li: li[index])

+0

我不要以爲他只是想交換l [1]和l [0],我想他想對它們進行排序。如果你有l [1],l [0] = min(l [1],l [0]),max(l [1],l [0]),你的代碼就可以工作 – 2012-01-05 20:14:52

0
import pprint 
li = [['m', 'z', 'asdgwergerwhwre'], 
     ['j', 'h', 'asdgasdgasdgasdgas'], 
     ['u', 'a', 'asdgasdgasdgasd'], 
     ['i', 'o', 'sdagasdgasdgdsag']] 

for _list in li: 
    _list[:2]=sorted(_list[:2]) 

pprint.pprint(sorted(li)) 

>>> 
[['a', 'u', 'asdgasdgasdgasd'], 
['h', 'j', 'asdgasdgasdgasdgas'], 
['i', 'o', 'sdagasdgasdgdsag'], 
['m', 'z', 'asdgwergerwhwre']]