2011-07-12 36 views
25

,如果我有一個包含看起來像這樣的列表清單...Python的排序列表,然後decending

['a',1] ['a',2] ['a',3] ['b',1] ['b',2] ['b',3] 

我怎麼能對它們進行排序,以便元素0被分配下降和元素1人354這樣的結果會是什麼樣子......

['b',1] ['b',2] ['b',3] ['a',1] ['a',2] ['a',3] 

使用itemgetter我可以反向傳遞元素0上,但後來我再打我反對元素,當然它破壞了以前的那種。我不能做一個組合鍵,因爲它需要先降序然後升序排序。

TIA, PK

回答

32
L = [['a',1], ['a',2], ['a',3], ['b',1], ['b',2], ['b',3]] 
L.sort(key=lambda k: (k[0], -k[1]), reverse=True) 

L現在包含:

[['b', 1], ['b', 2], ['b', 3], ['a', 1], ['a', 2], ['a', 3]] 
+0

只要它讓我接受。這正是我需要的。我正在爲我們的倉庫中的選項列表尋找倉位/倉庫路線問題,這確實有竅門。如果你有時間可以解釋「lambda k:(k [0], - k [1])」是什麼?負號表示相反嗎?我可以用lambda k得到相同的結果:(-k [0],k [1])沒有反向參數嗎? – Ominus

+0

@Ominus:'-k [1]'翻轉整數上的符號,以反轉它們的自然排序順序。由於該值是一個字符串,因此不能執行-k [0]。所以,'reverse = True'會顛倒排序順序,'-k [1]'會取消第二個元素的逆轉。 –

2

喜歡的東西

def mycmp(a, b): 

    res = cmp(a[0], b[0]) 
    if res == 0: 
    return cmp(a[1], b[1]) 
    return res 

newlist = sorted(input_list, cmp=mycmp) 

比較方法首先檢查每個元件的第一項。如果它們相等,它將檢查每個元素的第二項。爲了實現不同的排序行爲,mycmp()實現中的返回值可能會被取消。

25

可以做連續的排序,因爲python的sortstable。您需要先排序輔助鍵。另見official HOW TO

from operator import itemgetter 
l = [['a',2], ['a',1], ['b', 2], ['a',3], ['b',1], ['b',3]] 
l.sort(key=itemgetter(1)) 
l.sort(key=itemgetter(0), reverse=True) 
# [['b', 1], ['b', 2], ['b', 3], ['a', 1], ['a', 2], ['a', 3]]