如何先按x升序、再按y降序排序Python字典列表?
实现x升序、y降序的排序方法
当然有办法啦!最简洁高效的方式是利用排序键的特性——对y的值取负数,这样在升序排序时,负数的升序就等价于原y值的降序。结合x的升序需求,直接构造对应的键函数就行。
核心实现代码
a = [{"x" : 5 , "y" : 7} , {"x" : 4 , "y" : 3} , {"x" : 4 , "y" : 7}] sorted_result = sorted(a, key=lambda k: (k['x'], -k['y'])) print(sorted_result) # 输出: [{"x": 4, "y": 7}, {"x": 4, "y": 3}, {"x": 5, "y": 7}]
原理说明
- 对于
x,我们直接用原始值,这样排序时会按升序排列; - 对于
y,我们取其相反数-k['y'],当按升序排序这个负数时,原本大的y值对应的负数更小,会排在前面,也就实现了y的降序效果。
备选方案:自定义比较函数(效率较低,仅作参考)
如果你更习惯用自定义逻辑来做比较,可以借助functools.cmp_to_key把比较函数转换成排序键:
from functools import cmp_to_key def compare(item1, item2): # 先按x升序:x小的排前面 if item1['x'] != item2['x']: return item1['x'] - item2['x'] # x相等时按y降序:y大的排前面 else: return item2['y'] - item1['y'] sorted_result = sorted(a, key=cmp_to_key(compare))
不过这种方法的效率比键函数低,因为每次排序都要调用比较函数,而键函数只需要计算一次键值,所以优先推荐第一种方法。
内容的提问来源于stack exchange,提问作者Anshul Goyal
相关产品推荐
相关产品推荐

