2010-11-27 40 views
2

說我有一個字典:d = {'Abc':5,'Jack':4,'amy':9,'Tom':0,'abc':5}Python按特定定義的規則排序項目

如果我想寫一個函數,如果我將該函數傳遞給內置的排序函數,例如。列表(d).sort(函數)時,排序函數將根據值對任何具有相同值的列表進行排序,並按鍵(按字母順序排序)。因此,在這種情況下,d = {'Abc':5,'Jack':4,'amy':9,'Tom':0,'abc':5,'TAM':0}返回['amy' , 'ABC', 'ABC', '傑克', '譚', '湯姆'] 函數應該是這個樣子:

def arrange_items(something, thing,**may be a function**): 
     if something < thing: 
       return -1 
     elif something > thing: 
       return 1 
     etc 

如果我叫some_list.sort(arrange_items),我應該得到排序列表回

預先感謝您

修改規範(另一個問題)的: 如果我有Twitter用戶名的字典,字典的在這種格式:

dict = {'JohnZ':{'name': Jonny Zue,'follow':'MiniT',}, etc} # JohnZ is one of the twitter user. The follow means people that JonhZ follows, in this case it is MiniT. 

流行的用戶的裝置的跟隨該特定用戶,在上述例子中,MINIT的普及是至少一種B的人數/ c中至少有一個用戶誰遵循MiniT。

說我有一個twitter用戶名稱列表,比如說L1 = ['JonhZ','MiniT'等],我想根據用戶的流行度來排序L1(更高的流行度第一)。 dict已經在全局命名空間中定義了(我們可以直接訪問dict)。這種排序功能的要求是使用L1.sort(pass_function) 我應該如何編寫pass_function以便排序會根據流行度自動排序L1的用戶。

感謝您的幫助

回答

2
[k for k, v in sorted(d.iteritems(), key=lambda x: (-x[1], x[0].lower()))] 

編輯:

(我拒絕使用名爲 「字典」,因爲它隱藏了內置的,和陰影建宏是愚蠢的)

L1.sort(key=lambda x: (-d.get(x, 0), x.lower())) 
+0

說什麼是「愚蠢」是沒有幫助的。對於譯員和未來的編碼人員來說,內置插件可能是危險和麻煩的。但不是「愚蠢的」 – franklin 2013-07-06 19:18:10

0

你不能用list(d).sort(function)來實現,因爲你會得到一個帶有字典鍵的列表。您可以通過其他方法實現您的目標:

l1 = sorted(d.items(), key=lambda x: (x[1], x[0])) 
l2 = sorted(l1, key=lambda x: x[1], reverse=True) 
result = [x[0] for x in l2] 

此方法將字典轉換爲(鍵,值)元組列表。然後l1按值排序,l2按鍵排序。由於python具有穩定的排序算法,因此值的順序將保留爲相同的鍵。

編輯:Ignacio Vazquez-Abrar的方法類似,但更優雅,因爲列表只需要排序一次。