如何按值降序再按键升序排序字典?
就在我发现了神奇的 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)]