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
相关产品推荐
相关产品推荐

