按值排序字典然后键

tca*_*chy 32 python sorting dictionary

我可以按键或值排序,但我需要按值排序,然后按键排序,在一行中.为了更好地解释这一点,我可以告诉你我的问题:

dict = {'apple': 2, 'banana': 3, 'almond':2 , 'beetroot': 3, 'peach': 4}
Run Code Online (Sandbox Code Playgroud)

我希望我的输出按其值降序排序,然后按键(按字母顺序)升序(AZ).导致这样的清单:

随着输出: ['peach', 'banana', 'beetroot', 'almond', 'apple']

到目前为止我知道如何做的唯一方法是:

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (v,k))]
Run Code Online (Sandbox Code Playgroud)

随着输出: ['almond', 'apple', 'banana', 'beetroot', 'peach']

因此,它按升序对值进行排序,按升序(AZ)按字母顺序对键进行排序.所以如果我扭转这个:

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

随着输出: ['peach', 'beetroot', 'banana', 'apple', 'almond']

它按降序对值进行排序,按字母顺序按降序排序(ZA).

有没有办法我可以按降序对值进行排序,按升序排列键(即AZ)并获得上面显示的输出?

Ign*_*ams 44

您需要利用值为数字的事实.

>>> [v[0] for v in sorted(d.iteritems(), key=lambda(k, v): (-v, k))]
['peach', 'banana', 'beetroot', 'almond', 'apple']
Run Code Online (Sandbox Code Playgroud)

  • 只是提醒一下,Python 3删除了元组参数解包,所以上面的行现在应该写成`[v [0] for v in sorted(d.items(),key = lambda kv:( - kv [1],kv) [0]))]`.参见PEP 3113 https://www.python.org/dev/peps/pep-3113/ (17认同)
  • 键函数也可以写成 `operator.itemgetter(1, 0)` *如果*你不必颠倒键/值之一的顺序。 (2认同)

Kar*_*tel 5

对于可忽略的数量,按递减值排序是按递增的负值排序.

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (-v,k))]
Run Code Online (Sandbox Code Playgroud)