2012-03-29 111 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']