2013-07-26 158 views
3

我構建了一個列表[[13, "b"], [10, "b"], [10, "a",], [4,"c"], [1, "d"]],它按兩個元素列表中的第一個值排序。這是我能做的部分。我不知道的是,如果兩個元素是相同的,那麼我想按字母順序排序。我用來排序第一個列表的方法是通過第一個元素反轉排序列表。這然而使[10, "b"]之前[10, "a"]但我想在「b」之前「a」。有沒有一種方法可以按降序排列第一個元素,如果按第二個元素按字母順序排序,則排序?按第一個元素對元素列表排序,但如果按第二個元素排序則等於

+0

[Python 3 List:如何根據數字和字母對\ [('NJ',81),('CA',81),('DC',52)\]進行排序?] (http://stackoverflow.com/questions/17711598/python-3-list-how-do-i-sort-nj-81-ca-81-dc-52-base-on-number) –

回答

8

這工作:

>>> li=[[13, "b"], [10, "b"], [10, "a",], [4,"c"], [1, "d"]] 
>>> sorted(li,key=lambda sl: (-sl[0],sl[1])) 
[[13, 'b'], [10, 'a'], [10, 'b'], [4, 'c'], [1, 'd']] 

sorted function產生一個新的列表。您還可以使用排序方法排序到位名單:

>>> li=[[13, "b"], [10, "b"], [10, "a",], [4,"c"], [1, "d"]] 
>>> li.sort(key=lambda sl: (-sl[0],sl[1])) 
>>> li 
[[13, 'b'], [10, 'a'], [10, 'b'], [4, 'c'], [1, 'd']] 

你也可以做一個嵌套的排序(排序或按一個鍵,然後第二個鍵),因爲Python使用一個stable sort

>>> from operator import itemgetter 
>>> li=[[13, "b"], [10, "b"], [10, "a",], [4,"c"], [1, "d"]] 
>>> li.sort(key=itemgetter(1)) 
>>> li 
[[10, 'a'], [13, 'b'], [10, 'b'], [4, 'c'], [1, 'd']] 
>>> li.sort(key=itemgetter(0),reverse=True) 
>>> li 
[[13, 'b'], [10, 'a'], [10, 'b'], [4, 'c'], [1, 'd']] 

由於在一種元素排序中不需要lambda,所以我使用了更快的operator.itemgetter而不是lambda。是否兩個更快的排序比一個快,我不知道...你也可以使用lambda來實現這個方法。

有很大的sort tutorial,它顯示了很多這些成語。

+1

+1更快打字:)這裏是我的'排序(l,鍵= lambda x:(-x [0],x [1]))' –

相關問題