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

Python合并同键字典问题:defaultdict与update方法未生效

合并多个同键字典为单个字典

我需要将45个拥有相同键的字典合并为一个字典。我尝试使用defaultdict和update方法进行合并,但未能成功。以下是部分示例字典:

d1 = {'Image': 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Signal_Iduna_Park_before_the_match_%284th_july_2006%29.jpg/150px-Signal_Iduna_Park_before_the_match_%284th_july_2006%29.jpg', 'Stadium': 'Westfalenstadion', 'Capacity': '81,365', 'City': 'Dortmund', 'Population': '586,852', 'Postal Code': '44001-44388', 'State': 'North Rhine-Westphalia', 'Home Team': 'Borussia Dortmund', 'Opened Year': '1974', 'Notes': 'UEFA Category 4 stadium'}
d2 = {'Image': 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/12/M%C3%BCnchen_-_Allianz-Arena_%28Luftbild%29.jpg/150px-M%C3%BCnchen_-_Allianz-Arena_%28Luftbild%29.jpg', 'Stadium': 'Allianz Arena', 'Capacity': '75,000', 'City': 'Munich', 'Population': '1,487,708', 'Postal Code': '80331–81929', 'State': 'Bavaria', 'Home Team': 'FC Bayern Munich', 'Opened Year': '2005', 'Notes': 'UEFA Category 4 stadium'}
d3 = {'Image': 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/3c/Olympiastadionberlin2005.JPG/150px-Olympiastadionberlin2005.JPG', 'Stadium': 'Olympiastadion Berlin', 'Capacity': '74,475', 'City': 'Berlin', 'Population': '3,677,472', 'Postal Code': '', 'State': 'Berlin', 'Home Team': 'Hertha BSC', 'Opened Year': '1936', 'Notes': 'UEFA Category 4 stadium'}
d4 = {'Image': 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f0/Olympiastadion_Muenchen.jpg/150px-Olympiastadion_Muenchen.jpg', 'Stadium': 'Olympiastadion Munich', 'Capacity': '69,250', 'City': 'Munich', 'Population': '1,487,708', 'Postal Code': '80331–81929', 'State': 'Bavaria', 'Home Team': 'Various', 'Opened Year': '1972', 'Notes': ''}
d5 = {'Image': 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/45/2010-06-03_Arena_AufSchalke_01.jpg/150px-2010-06-03_Arena_AufSchalke_01.jpg', 'Stadium': 'Veltins-Arena', 'Capacity': '62,271', 'City': 'Gelsenkirchen', 'Population': '', 'Postal Code': '45801-45899', 'State': 'North Rhine-Westphalia', 'Home Team': 'FC Schalke 04', 'Opened Year': '2001', 'Notes': 'UEFA Category 4 stadium'}
d6 = {'Image': 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/Blick_vom_Rotenberg_Stadion.jpg/150px-Blick_vom_Rotenberg_Stadion.jpg', 'Stadium': 'Mercedes-Benz Arena', 'Capacity': '60,469', 'City': 'Stuttgart', 'Population': '626,275', 'Postal Code': '70173–70619', 'State': 'Baden-Württemberg', 'Home Team': 'VfB Stuttgart', 'Opened Year': '1933', 'Notes': 'UEFA Category 4 stadium'}

方法一:字典推导式

先把所有字典存入一个列表(比如dicts = [d1, d2, ..., d45]),然后通过推导式生成合并后的字典,每个键对应所有字典中该键的值组成的列表:

dicts = [d1, d2, d3, d4, d5, d6]  # 替换为包含45个字典的列表
merged_dict = {key: [d[key] for d in dicts] for key in dicts[0].keys()}

方法二:正确使用defaultdict

你之前用defaultdict失败大概率是误用了update——update会覆盖现有值而非追加。正确做法是用defaultdict(list)来收集每个键的所有值:

from collections import defaultdict

dicts = [d1, d2, d3, d4, d5, d6]
merged_dict = defaultdict(list)
for d in dicts:
    for key, value in d.items():
        merged_dict[key].append(value)

# 如需转为普通字典,执行下面一行
merged_dict = dict(merged_dict)

方法三:zip+映射(适用于键顺序完全一致的情况)

如果所有字典的键顺序完全相同,可通过zip快速打包对应位置的值:

dicts = [d1, d2, d3, d4, d5, d6]
keys = dicts[0].keys()
merged_dict = {key: list(values) for key, values in zip(keys, zip(*[d.values() for d in dicts]))}

注意事项

若个别字典可能缺失某个键(即便你说明所有字典键相同,也可提前规避错误),可把列表推导里的d[key]替换为d.get(key, ''),缺失键时会用空字符串填充,避免抛出KeyError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:47:25