Python 如何对字典列表中product和city相同的项的quantity字段求和
Python 字典列表按多字段分组累加的Pythonic实现
推荐使用collections.defaultdict实现,时间复杂度O(n),写法简洁易读:
from collections import defaultdict list_of_dicts = [ {'product': 'car', 'city': 'new york', 'quantity': 13}, {'product': 'car', 'city': 'new york', 'quantity': 25}, {'product': 'bus', 'city': 'miami', 'quantity': 5}, {'product': 'container', 'city': 'atlanta', 'quantity': 5}, {'product': 'container', 'city': 'atlanta', 'quantity': 8} ] count_map = defaultdict(int) for item in list_of_dicts: # 用product和city组成组合键 key = (item['product'], item['city']) count_map[key] += item['quantity'] # 转换为目标格式的字典列表 result_list_of_dicts = [ {'product': p, 'city': c, 'quantity': cnt} for (p, c), cnt in count_map.items() ]
运行后得到的result_list_of_dicts完全符合你要求的输出格式。
如果你倾向用itertools.groupby实现,需要先对列表按分组字段排序(groupby仅能合并连续的同组元素),写法如下:
from itertools import groupby from operator import itemgetter # 先按product、city排序 sorted_list = sorted(list_of_dicts, key=itemgetter('product', 'city')) result_list_of_dicts = [] for (p, c), group in groupby(sorted_list, key=itemgetter('product', 'city')): total_q = sum(item['quantity'] for item in group) result_list_of_dicts.append({'product': p, 'city': c, 'quantity': total_q})
两种方案对比:
- 优先选defaultdict方案:不需要额外排序,性能更高,逻辑更直观
- groupby方案适合原始数据已经按分组字段排好序的场景,不需要额外引入哈希表存储中间结果
注:你给出的原始列表中部分quantity键后缺少冒号,实际运行时需要补全。
内容的提问来源于stack exchange,提问作者buxxxbaum
相关产品推荐
相关产品推荐

