2012-07-12 49 views
6

我有元組的列表:具有多個參數的複雜排序?

li = [('fink', 3), ('flip', 3), ('flock', 4), ('foo', 12), ('foot', 20), ('football', 20), ('futz', 10), ('flip', 3), ('flank', 3), ('flop', 3)] 

我怎麼能先排序血統號列表,然後按字母順序降序?結果將是:

('foot', 20) 
('football', 20) 
('foo', 12) 
('futz', 10) 
('flock', 4) 
('fink', 3) 
('flip', 3) 
('flake', 3) 
('flop', 3) 

from operator import itemgetter 

sorted_li = sorted(li, key=itemgetter(1,0), reverse=True) 

雖然上面的代碼排序通過正確地降數,單詞不按字母順序排序。

+0

[嵌套元組列表的高級排序標準]的可能重複(http://stackoverflow.com/questions/3831449/advanced-sorting-criteria-for-a-list-of-nested-tuples) – eumiro 2012-07-12 11:02:42

回答

9

這是一個itemgetter太複雜了。使用lambda代替:

sorted_li = sorted(li, key=lambda x: (-x[1], x[0])) 

這是大致相同的速度使用itemgetter連續兩次排序,但它是更少的代碼,可能更具可讀性。

+0

This因爲你可以使用排序元素是一個數字的事實。如果兩者都是字符串呢? – 2012-07-12 11:02:34

+1

@JonClements他會用你的解決方案:) – jamylak 2012-07-12 11:17:51

6

對於Python的排序是穩定的,這是最簡單的兩次排序:

sorted_li = sorted(li, key=itemgetter(1), reverse=True) 
sorted_li.sort(key=itemgetter(0))