按值然后键对字典进行排序

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']

【讨论】:

以上是关于按值然后键对字典进行排序的主要内容,如果未能解决你的问题,请参考以下文章

使用字典中的键对对象数组进行排序

在 C# 中按名称和日期作为键对字典进行排序? [复制]

使用 std::string 作为字典顺序的键对 unordered_map 进行排序

添加键的值并按在 Python 中的字典列表中出现的键对其进行排序

按值对字典进行排序[重复]

如何按值对 Python 字典进行排序? [复制]