Python自定义排序:同value分组下按importance排序实现方案
Python 自定义排序实现分组内优先级排序
需求描述
给定如下数据:
item_list = [ {"id": "5", "name": "tomato", "value": 3}, {"id": "2", "name": "banana", "value": 2}, {"id": "4", "name": "tomato", "value": 2}, {"id": "1", "name": "banana", "value": 1.5}, {"id": "8", "name": "peas", "value": 1.5}, {"id": "7", "name": "peas", "value": 0.5} ] importance = { "tomato": 2, "banana": 1, "peas": 6 }
要求:在已按value降序预排序的基础上,对相同value的分组,按照importance对应的值降序排序,最终得到目标结果:
sorted_list = [ {"id": "5", "name": "tomato", "value": 3}, {"id": "4", "name": "tomato", "value": 2}, {"id": "2", "name": "banana", "value": 2}, {"id": "8", "name": "peas", "value": 1.5}, {"id": "1", "name": "banana", "value": 1.5}, {"id": "7", "name": "peas", "value": 0.5} ]
解决方案
方法一:利用sort/sorted的key参数(最优方案)
Python的排序函数支持通过key参数指定排序依据,我们可以构造一个元组键,先按value降序,再按importance降序。通过对数值取负,实现降序效果(默认排序是升序)。
代码实现:
# 直接修改原列表排序 item_list.sort(key=lambda x: (-x["value"], -importance[x["name"]])) # 或生成新排序后的列表(不修改原列表) sorted_list = sorted(item_list, key=lambda x: (-x["value"], -importance[x["name"]]))
原理:排序时会依次比较元组中的元素,先比较-x["value"](等价于value从大到小),当value相同时,再比较-importance[x["name"]](等价于importance值从大到小),完全匹配需求,且代码简洁、效率高(每个元素仅计算一次键值)。
方法二:自定义比较函数(兼容复杂逻辑场景)
如果需要更复杂的比较逻辑,可以自定义比较函数,通过functools.cmp_to_key转换为排序键使用:
from functools import cmp_to_key def custom_compare(a, b): # 先按value降序比较 if a["value"] > b["value"]: return -1 elif a["value"] < b["value"]: return 1 # value相同时,按importance降序比较 imp_a = importance[a["name"]] imp_b = importance[b["name"]] if imp_a > imp_b: return -1 elif imp_a < imp_b: return 1 # 两者都相同则顺序不变 return 0 sorted_list = sorted(item_list, key=cmp_to_key(custom_compare))
注意:这种方法效率低于key参数方案,因为每次排序比较都要调用函数,适合逻辑复杂、无法用简单键值表达的场景。
总结
优先选择方法一,它代码简洁、执行高效,完全满足当前需求;方法二仅作为复杂比较场景的备选方案。
内容的提问来源于stack exchange,提问作者jpdoliveiramc
相关产品推荐
相关产品推荐

