cmp
一個函數應返回的整數,當0
相等,1
或當a
應該來b
和-1
或更低,如果他們應該來以相反的順序後更高。
您改爲返回False
和True
。由於Python布爾類型是int
的子類,因此在解釋爲整數時,這些對象的值爲0
和1
。你永遠不會返回-1
,所以你混淆了排序算法;你告訴它,a
和b
的順序要麼總是'等於',要麼總是應該在b
之前應該有a
。但排序算法有時要求a
和b
交換,在這種情況下,您給它提供了衝突信息!
請注意,您的表情比較冗長; True if a.mentioned > b.mentioned else False
可以簡化爲a.mentioned > b.mentioned
; >
運營商已經生產了True
或False
。使用簡單的整數,你可以看到,這是不會產生預期的結果:
>>> sorted([4, 2, 5, 3, 8], cmp=lambda a, b: a > b)
[4, 2, 5, 3, 8]
而實際返回-1
,0
,或1
做工作:
>>> sorted([4, 2, 5, 3, 8], cmp=lambda a, b: 1 if a > b else 0 if a == b else -1)
[2, 3, 4, 5, 8]
或代替這種冗長的表達方式,只需使用內置的cmp()
function;你的情況下,你使用的是這樣的:
srt = sorted(twitter_users.values(), cmp=lambda a, b: cmp(a.mentioned, b.mentioned))
但你真的不應該使用cmp
在所有;有一個更簡單(更高效)的選擇。只需使用key
函數來代替,它簡單的返回mentioned
屬性:
srt = sorted(twitter_users.values(), key=lambda v: v.mentioned)
的key
功能產生由實際的排序發生值;此功能用於生成Schwartzian transform。這種變換更高效,因爲它只被稱爲O(n)次,而函數O(n log n)次被稱爲O(n log n)次。
因爲你只訪問一個屬性,而不是lambda
,你可以用一個operator.attrgetter()
object做屬性獲取爲您:在任何情況下
from operator import attrgetter
srt = sorted(twitter_users.values(), key=attrgetter('mentioned'))
,這是更好的寫作'排序(LST,關鍵= lambda x:x. mentioned)' – shx2
'提到'的類型是什麼? – Thomas
@Thomas整數 – displayname