按值然后键对字典进行排序
Posted
技术标签:
【中文标题】按值然后键对字典进行排序【英文标题】:Sorting a dictionary by value then key 【发布时间】:2012-04-12 17:50:52 【问题描述】:我可以按键或值排序,但我需要在一行中先按值排序,然后按键排序。为了更好地解释这一点,我可以向您展示我的问题:
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']
因此它按升序对值进行排序,并按字母升序 (A-Z) 对键进行排序。因此,如果我将其反转:
[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)对键进行排序并获得上面显示的输出?
【问题讨论】:
【参考方案1】:您需要利用值是数字这一事实。
>>> [v[0] for v in sorted(d.iteritems(), key=lambda(k, v): (-v, k))]
['peach', 'banana', 'beetroot', 'almond', 'apple']
【讨论】:
只是提醒一下 Python 3 删除了元组参数解包,所以上面的行现在应该写成[v[0] for v in sorted(d.items(), key=lambda kv: (-kv[1], kv[0]))]
。见 PEP 3113 python.org/dev/peps/pep-3113
键函数也可以写成operator.itemgetter(1, 0)
如果你不必颠倒键/值之一的顺序。
key=lambda(k, v): (-v, k)) 是什么意思?我知道 lambda 是一个匿名函数,但它没有返回语句这一事实令人困惑。
@NickKiermaier:表达式是返回的内容。
我明白了。谢谢。【参考方案2】:
对于可负数,按降序排序是按负值升序排序。
[v[0] for v in sorted(dict.items(), key=lambda(k,v): (-v,k))]
【讨论】:
【参考方案3】:>>> 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']
【讨论】:
以上是关于按值然后键对字典进行排序的主要内容,如果未能解决你的问题,请参考以下文章
使用 std::string 作为字典顺序的键对 unordered_map 进行排序