You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:52:48