選項1:
key=lambda d:(d['rank']==0, d['rank'])
選項2:
key=lambda d:d['rank'] if d['rank']!=0 else float('inf')
演示:
「我喜歡按照它排序等級值,排序如下:1-2-3-4-0-0-0。「 --original海報
>>> sorted([0,0,0,1,2,3,4], key=lambda x:(x==0, x))
[1, 2, 3, 4, 0, 0]
>>> sorted([0,0,0,1,2,3,4], key=lambda x:x if x!=0 else float('inf'))
[1, 2, 3, 4, 0, 0]
附加註釋:?
「請你能不能給我(一個Python新手),它在做什麼解釋,我可以看到,它是一個lambda,我知道它是一個匿名函數:括號中的內容是什麼?「 - OP評論
索引/切片標誌:
itemgetter('rank')
是一回事lambda x: x['rank']
的是同樣的事情功能:
def getRank(myDict):
return myDict['rank']
的[...]
被稱爲索引/切片符號,請參閱Explain Python's slice notation - 還請注意,someArray[n]
是許多用於索引的編程語言的通用符號,但可能不支持格式爲的切片或[start:end:step]
。
key=
VS cmp=
VS豐富的比較:
至於到底是怎麼回事,有指定的排序算法是如何工作的兩種常用方法:一種是用key
功能,另一種是用cmp
函數(現在在python中已棄用,但功能更多)。雖然cmp
函數允許您任意指定兩個元素應該如何比較(輸入:a
,b
;輸出:a<b
或a>b
或或a==b
)。儘管是合法的,但它並沒有給我們帶來什麼好處(我們必須以笨拙的方式複製代碼),而且一個關鍵功能對於您的情況更自然。 (見「反對富人比較」如何在一個優雅的,但可能是,過度的方式來隱式地定義cmp=
)
實現你的關鍵功能:
不幸的是0是整數的元素,因而具有自然排序:0通常是< 1,2,3 ...因此,如果我們想強加一個額外的規則,我們需要在「更高級別」排序列表。我們通過使關鍵字成爲元組來實現這一點:元組首先按第一個元素排序,然後按第二個元素排序。真假將永遠在假之後下令,所以所有的真主都會在假的後面下令;他們會按正常排序:(True,1)<(True,2)<(True,3)<...
,(False,1)<(False,2)<...
,(False,*)<(True,*)
。替代方案(方案2)僅僅將0級字典賦予無窮大的值,因爲它保證高於任何可能的級別。
更一般替代 - 對象豐富的比較:
的更一般的解決方案是創建代表記錄的類,然後實現__lt__
,__gt__
,__eq__
,__ne__
,__gt__
,__ge__
,和所有其他rich comparison operators,或者只是實現其中的一個,__eq__
並使用@functools.total_ordering
decorator。這會導致該類的對象在您使用比較運算符時使用自定義邏輯(例如x=Record(name='Joe', rank=12)
y=Record(...)
x<y
);因爲sorted(...)
函數在比較排序中默認使用<
和其他比較運算符,所以這會在排序時使行爲自動執行,並且在其他情況下使用<
和其他比較運算符。這可能會或可能不會過多,具體取決於您的用例。
清潔的替代 - 不超載語義0:
我不過應該指出的是,這是一個有點人爲的把後面的0 1,2,3,4等。這是否合理取決於rank = 0是否意味着rank = 0;如果rank = 0真的比rank = 1「低」(反過來,它實際上是「低於」rank = 2 ......)。如果確實如此,那麼你的方法是完全正確的。如果情況並非如此,那麼您可以考慮省略'rank':...
條目而不是設置'rank':0
。
選項1不同的方案:
key=lambda d: (not 'rank' in d, d['rank'])
選項2不同的方案:
key=lambda d: d.get('rank', float('inf'))
旁註:依託,那麼你可以通過使用'rank' in d
,或者通過列弗Levitsky的答案排序在python中無窮大的存在幾乎是一個黑客的邊界,使任何提到的解決方案(元組,對象比較),列夫的filter-then-concatenate solution,甚至可能是稍微複雜的cmp
solution (由威爾遜鍵入),更普遍的其他語言。
請解釋您的不正確的downvote。 =) – ninjagecko 2012-04-12 18:35:45
選項1的作品!謝謝。 – Richard 2012-04-12 18:37:08
請你能向我解釋一下(Python新手)它在做什麼?我可以看到這是一個lambda,我知道它是一個匿名函數:括號內的數字是什麼? – Richard 2012-04-12 18:38:42