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

如何使用多个键合并两个Python字典列表?

基于多键合并两个字典列表的解决方案

没问题!要基于id和year这两个键合并你给出的两个字典列表,咱们可以利用字典的键唯一性,把(id, year)的元组作为唯一标识,快速完成数据整合。下面给你两种实用的实现方式:

方法一:分步处理,兼容性强

这种方式逻辑清晰,适合新手理解,也能灵活处理其中一个列表包含额外条目的情况:

# 定义原始数据列表
l1 = [{'id': 1, 'year': '2017', 'resultA': 2}, 
      {'id': 2, 'year': '2017', 'resultA': 3}, 
      {'id': 1, 'year': '2018', 'resultA': 3}, 
      {'id': 2, 'year': '2018', 'resultA': 5}]

l2 = [{'id': 1, 'year': '2017', 'resultB': 5}, 
      {'id': 2, 'year': '2017', 'resultB': 8}, 
      {'id': 1, 'year': '2018', 'resultB': 7}, 
      {'id': 2, 'year': '2018', 'resultB': 6}]  # 补全了你示例中缺失的值

# 创建临时字典,用(id, year)作为唯一键
merged_map = {}

# 先把l1的内容存入临时字典,避免修改原数据
for item in l1:
    key = (item['id'], item['year'])
    merged_map[key] = item.copy()

# 遍历l2,将resultB合并到对应条目里
for item in l2:
    key = (item['id'], item['year'])
    if key in merged_map:
        merged_map[key].update(item)
    else:
        # 如果l2有l1没有的条目,也可以直接添加,按需调整
        merged_map[key] = item.copy()

# 把字典的值转换成列表,得到最终合并结果
merged_list = list(merged_map.values())

# 打印结果
print(merged_list)

运行后你会得到这样的结果:

[
 {'id': 1, 'year': '2017', 'resultA': 2, 'resultB': 5},
 {'id': 2, 'year': '2017', 'resultA': 3, 'resultB': 8},
 {'id': 1, 'year': '2018', 'resultA': 3, 'resultB': 7},
 {'id': 2, 'year': '2018', 'resultA': 5, 'resultB': 6}
]

方法二:用字典推导式+解包,更简洁

如果你喜欢更Pythonic的写法,可以用字典推导式和字典解包**来实现,代码更紧凑:

l1 = [{'id': 1, 'year': '2017', 'resultA': 2}, 
      {'id': 2, 'year': '2017', 'resultA': 3}, 
      {'id': 1, 'year': '2018', 'resultA': 3}, 
      {'id': 2, 'year': '2018', 'resultA': 5}]

l2 = [{'id': 1, 'year': '2017', 'resultB': 5}, 
      {'id': 2, 'year': '2017', 'resultB': 8}, 
      {'id': 1, 'year': '2018', 'resultB': 7}, 
      {'id': 2, 'year': '2018', 'resultB': 6}]

# 先把l1转成以(id, year)为键的字典
l1_dict = {(d['id'], d['year']): d for d in l1}

# 遍历l2,合并到l1_dict中(如果键存在则合并,不存在则添加)
for d in l2:
    key = (d['id'], d['year'])
    l1_dict[key] = {**l1_dict.get(key, {}), **d}

# 转换为列表得到结果
merged_list = list(l1_dict.values())

这个方法的原理和第一种一致,只是用了字典解包来快速合并两个字典,代码更简洁。

注意事项

  • 这两种方法的时间复杂度都是O(n+m)(n和m分别是两个列表的长度),效率很高;
  • 如果两个列表中存在id和year完全相同但其他键重复的情况(虽然你的示例里没有),后面的字典内容会覆盖前面的,你可以根据需求修改逻辑来处理冲突;
  • 如果其中一个列表有另一个列表没有的id+year组合,代码会自动保留这些条目(方法一的else分支和方法二的get(key, {})都处理了这种情况)。

内容的提问来源于stack exchange,提问作者Thirst for Knowledge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:25:33