Python字典双值优先级排序实现:一值降序、一值升序
问题原因
你原来的实现逻辑有误:第一次按数值降序排序后,第二次调用sort按字符串升序排序,会覆盖第一次的排序优先级,最终结果变成优先按字符串升序排列,自然不符合预期。
解决方法
Python原生的sorted和列表sort方法天然支持多优先级排序,只需要让key参数返回一个优先级从左到右排列的元组即可。
针对你的需求(优先按数值降序,数值相同按字符串升序),可以利用数值取负后升序等价于原值降序的特性,直接写出如下代码:
# 原始字典 x = {'david': ['APP', 2], 'ala': ['PROD', 2], 'steven': ['DEV', 4], 'katya': ['SYS', 2]} # 多优先级排序 res = sorted(x.items(), key=lambda elem: (-elem[1][1], elem[1][0])) print(res)
运行输出就是你期望的结果:
[('steven', ['DEV', 4]), ('david', ['APP', 2]), ('ala', ['PROD', 2]), ('katya', ['SYS', 2])]
原理说明
- 元组的比较逻辑是从左到右依次比较元素,第一个元素相等时才会比较第二个元素,正好对应多优先级的需求
- 我们把数值取负作为第一个排序键,默认升序排列时,负数越大(对应原数值越大)的元素就会排在越前面,实现了原数值的降序需求
- 数值相等时,自动按第二个键(值列表的第一个字符串)升序排列,完全匹配你的要求
如果遇到无法通过取负实现降序的场景(比如字符串需要降序),也可以用functools.cmp_to_key自定义比较函数,但你当前的场景用元组key的方案是最高效简洁的。
内容的提问来源于stack exchange,提问作者Quasi31
相关产品推荐
相关产品推荐

