2012-03-29 236 views
19

我可以按鍵或值排序,但我需要它按值排序,然後鍵入一行。爲了解釋這個更好,我可以告訴你我的問題:按值排序字典然後鍵

dict = {'apple': 2, 'banana': 3, 'almond':2 , 'beetroot': 3, 'peach': 4} 

我希望我的輸出被他們的價值降序排序,然後由他們的鍵(按字母順序排列)升序(A-Z)。造成這樣的列表:

隨着輸出:['peach', 'banana', 'beetroot', 'almond', 'apple']

的唯一途徑,我知道如何做到這一點至今是:

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (v,k))] 

隨着輸出:['almond', 'apple', 'banana', 'beetroot', 'peach']

所以它已經按照升序排列了這些值並按照升序排列了按鍵(AZ)。所以,如果我扭轉這一:

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (v,k), reverse=True)] 

隨着輸出:['peach', 'beetroot', 'banana', 'apple', 'almond']

它已按字母順序排序以降序(Z-A)以降序的值和密鑰。

有沒有一種方法,我可以降序排序值和按升序排列的鍵(即A-Z),並得到我上面顯示的輸出?

回答

34

您需要利用值爲數字這一事實。

>>> [v[0] for v in sorted(d.iteritems(), key=lambda(k, v): (-v, k))] 
['peach', 'banana', 'beetroot', 'almond', 'apple'] 
+6

只是一個提醒了Python 3除去元組參數拆包,所以線之上現在應寫爲'[V [0],在排序(d.items()V,鍵=拉姆達KV :(-kv [1],kv [0]))]'。請參閱PEP 3113 https://www.python.org/dev/peps/pep-3113/ – 2016-08-07 23:13:53

+0

關鍵函數也可以寫成'operator.itemgetter(1,0)'*如果您不必反轉鍵/值之一的排序。 – Moberg 2016-12-07 14:54:49

5

要按降序排序,對於可否定量,按升序負值進行排序。

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (-v,k))] 
1
>>> d = {'apple':2, 'banana':3, 'almond':2, 'beetroot':3, 'peach':4} 
>>> [k for k, v in sorted(d.iteritems(), key=lambda(k, v): (-v, k))] 
['peach', 'banana', 'beetroot', 'almond', 'apple']