Python如何单次调用sort按多字段规则对元组列表排序
解答
仅需调用**1次sort()**即可实现需求,无需多次调用,也不需要引入任何模块,直接通过lambda返回元组形式的排序键就能完成。
核心逻辑
Python的sort()在key返回元组时,会按照元组元素从左到右的优先级依次比较,正好匹配“第二字段降序优先级更高、同值时第一字段升序”的规则:
- 对需要降序排列的数值型第二字段(索引1),直接取负值作为key的第一个元素:默认升序排序时,原值越大对应的负值越小,会自动排在前面,等价于对原字段做降序
- 对需要升序排列的第一字段(索引0),直接取原值作为key的第二个元素,默认升序即可满足要求
可直接运行的代码
arr = [('f', 1), ('g', 2), ('h', 3), ('a', 1), ('j', 1), ('o', 1), ('v', 2)] arr.sort(key=lambda x: (-x[1], x[0])) print(arr)
执行后输出结果完全符合预期:
[('h', 3), ('g', 2), ('v', 2), ('a', 1), ('f', 1), ('j', 1), ('o', 1)]
原有写法的问题
之前使用的arr.sort(reverse=True, key=lambda x: x[1])不符合要求的原因很明确:
reverse=True会对整个排序键的结果做全局反转,无法支持不同字段不同升降序的混合规则- key只传入了第二字段,同值分组内的元素会保留原列表的相对位置(Python的sort是稳定排序),因此第一字段不会自动按升序排列
注:如果后续遇到非数值类型无法取负的混合升降序场景,才需要利用稳定排序特性做两次排序(先排低优先级字段,再排高优先级字段),但当前场景下一次排序是最优方案,代码更简洁、性能更好。
内容的提问来源于stack exchange,提问作者Debtanu Gupta
相关产品推荐
相关产品推荐

