如何按值(降序)和键(升序)对字典进行排序?

30

在发现了令人惊叹的sorted()之后,我又遇到了困难。

问题是,我有一个字典,形式为string(key) : integer(value),我需要按其整数值的降序对其进行排序,但是如果两个元素具有相同的值,则按键的升序排列。

以下是一个例子,以使其更清晰:

d = {'banana':3, 'orange':5, 'apple':5}
out: [('apple', 5), ('orange', 5), ('banana', 3)]

经过一些研究,我得出了类似以下的结果:

sorted(d.items(), key=operator.itemgetter(1,0), reverse=True)
out: [('orange', 5), ('apple', 5), ('banana', 3)]

这是因为它正在对值和键进行反向排序。我需要键保持不反向。
2个回答

80

类似于某事

In [1]: d = {'banana': 3, 'orange': 5, 'apple': 5}

In [2]: sorted(d.items(), key=lambda x: (-x[1], x[0]))
Out[2]: [('apple', 5), ('orange', 5), ('banana', 3)]

这是我最喜欢的Python脚本编码计划之一。 - Ananda G
为什么需要 -x[1]?你能解释一下这部分吗? - Malavan
4
@Malavan x[1] 是字典里的值。它被取反了,这样更大的值就会排在更小的值前面(降序)。 - Lev Levitsky

-1
  • 字典不能直接排序,因此需要对包含键/值对的元组列表 items() 进行排序。

  • 由于要按值字段排序,然后按键字段排序,因此需要使用 operator.itemgetter 从元组中提取这些字段作为排序键。

  • 最后,要在一个字段上降序排序,在另一个字段上降序排序,需要进行两次排序,首先按辅助键升序排序,然后再按主键降序排序。这一步依赖于 Python 的排序稳定性

例如:

import operator
In [1]: d = {'banana': 3, 'orange': 5, 'apple': 5}

In [2]: fruit = sorted(d.items(), key=operator.itemgetter(0))
In [3]: sorted(fruit, key=operator.itemgetter(1), reverse=True)
Out[3]: [('apple', 5), ('orange', 5), ('banana', 3)]

请参阅Python排序指南以获取更多详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接