Python中二维数组如何先按数值降序、同值再按名称升序排序
问题原因
你原代码的问题在于reverse=True会对key返回的元组所有元素统一应用倒序规则,所以数值按降序排列的同时,姓名也被强制按降序排序,才会出现john排在jim前面的不符合预期的结果。
解决方案
最简洁的实现方式是把数值部分取负数作为排序key的第一个元素,不使用全局reverse参数:负数的升序排列等价于原数值的降序排列,而姓名部分保持默认的升序规则,刚好匹配你的需求。
实现代码如下:
people_list = [['jim', 33000], ['james', 22000], ['john', 33000], ['zack', 10000]] sorted_by_int_then_name = sorted(people_list, key=lambda person: (-person[1], person[0]))
运行后输出结果和你预期完全一致:
>>> sorted_by_int_then_name [['jim', 33000], ['john', 33000], ['james', 22000], ['zack', 10000]]
拓展方案(适用于更复杂的排序场景)
如果后续需要处理非数值类型的多规则排序,可以使用functools.cmp_to_key自定义比较函数实现,代码如下:
from functools import cmp_to_key def compare(person1, person2): # 优先比较数值,数值大的排在前面 if person1[1] != person2[1]: return person2[1] - person1[1] # 数值相同时比较姓名,字典序更小的排在前面 return -1 if person1[0] < person2[0] else 1 sorted_by_int_then_name = sorted(people_list, key=cmp_to_key(compare))
内容的提问来源于stack exchange,提问作者Sam Fuller
相关产品推荐
相关产品推荐

