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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:15:05