如何按值降序再按键升序排序字典?

30 投票
2 回答
41521 浏览
提问于 2025-04-17 18:51

就在我发现了神奇的 sorted() 之后,我又遇到了问题。

问题是我有一个字典,格式是 字符串(键) : 整数(值),我需要按照整数值的降序来排序,但是如果有两个元素的值相同,那就要按键的升序来排序。

下面是一个例子,能让这个问题更清楚:

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 个回答

-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排序指南

81

类似这样的东西

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

撰写回答