如何按值降序、键升序对Python OrderedDict进行排序?
OrderedDict 排序:值降序、键升序的实现
需求说明
需要对OrderedDict执行排序,规则为:
- 优先按值降序排列
- 当值相同时,按键升序排列
原始OrderedDict:
from collections import OrderedDict A = OrderedDict({'a': 7, 'h': 6, 'c': 11, 'cc': 11, 'm': 9, 'n': 11, 'g': 7, 'b': 5.0, 'k': 11})
预期排序结果:
A = OrderedDict({'c': 11, 'cc': 11, 'k': 11, 'n': 11, 'm': 9, 'a': 7, 'g': 7, 'h': 6, 'b': 5.0})
错误尝试及问题分析
尝试了以下代码:
OrderedDict(sorted(A.items(), key=lambda x: (x[1],x[0]),reverse=True))
得到的结果不符合预期:
OrderedDict({'n': 11, 'k': 11, 'cc': 11, 'c': 11, 'm': 9, 'g': 7, 'a': 7, 'h': 6, 'b': 5.0})
问题出在reverse=True会对整个排序键元组(x[1], x[0])进行反转,虽然实现了值的降序,但同时也把键的排序逻辑反转成了降序,导致值相同时键是从大到小排列,和需求的键升序相反。
正确实现代码
OrderedDict(sorted(A.items(), key=lambda x: (-x[1], x[0]), reverse=False))
逻辑解释
- 对值取负数
-x[1]:这样在默认升序排序时,数值大的负数更小,会排在前面,等价于原数值的降序排列 - 键保持原顺序
x[0]:当值对应的负数相同时(即原数值相等),直接按键的升序排列 reverse=False可以省略,因为sorted默认就是升序排序
内容的提问来源于stack exchange,提问作者meykh
相关产品推荐
相关产品推荐

