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

Python实现字典列表按cat_id分组汇总items值的方法

最优实现方案

核心逻辑是一次遍历完成聚合,时间复杂度O(n),无额外冗余开销,完全满足所有约束要求。

因为cat_id和category一一对应,直接拿cat_id作为聚合唯一键即可,不需要提前对原列表做排序,不管分类条目怎么混杂排布都能正确统计。

纯标准库无依赖实现(兼容性最好)

不需要安装任何第三方包,全Python3版本通用:

given_list = [
    {"cat_id": 1, "category": "red", "items": 1},
    {"cat_id": 1, "category": "red", "items": 3},
    {"cat_id": 2, "category": "yellow", "items": 2},
    {"cat_id": 2, "category": "yellow", "items": 4},
    {"cat_id": 2, "category": "yellow", "items": 6},
    {"cat_id": 3, "category": "green", "items": 99},
]

agg_tmp = {}
for row in given_list:
    cid = row["cat_id"]
    if cid not in agg_tmp:
        agg_tmp[cid] = {"cat_id": cid, "category": row["category"], "items": 0}
    agg_tmp[cid]["items"] += row["items"]

outcome = list(agg_tmp.values())

运行后outcome的结果和预期完全一致,Python3.7+版本下输出顺序和原列表中各分类首次出现的顺序一致,如果是更低版本需要保序,把agg_tmp替换成collections.OrderedDict()即可。

简化写法(适合快速写脚本)

引入标准库defaultdict可以少写几行初始化判断逻辑:

from collections import defaultdict

given_list = [
    {"cat_id": 1, "category": "red", "items": 1},
    {"cat_id": 1, "category": "red", "items": 3},
    {"cat_id": 2, "category": "yellow", "items": 2},
    {"cat_id": 2, "category": "yellow", "items": 4},
    {"cat_id": 2, "category": "yellow", "items": 6},
    {"cat_id": 3, "category": "green", "items": 99},
]

item_total = defaultdict(int)
cat_map = {}
for row in given_list:
    cid = row["cat_id"]
    item_total[cid] += row["items"]
    cat_map[cid] = row["category"]

outcome = [
    {"cat_id": cid, "category": cat_map[cid], "items": total}
    for cid, total in item_total.items()
]

避坑说明

不要用「先按分类把所有items攒成列表,最后再对列表求和」的写法,这种方案会额外存储所有items的原始值,数据量大的时候内存开销和耗时都会明显升高,边遍历边累加的写法性能最优。

内容的提问来源于stack exchange,提问作者mtsk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 08:57:21