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

如何基于name键合并两个Python字典列表?附尝试代码

基于共同键合并字典列表的正确方法

问题描述

现有两个字典列表:

dict1 = [{'id': 1.0, 'name': 'aa'},
 {'id': 4.0, 'name': 'bb'},
 {'id': 2.0, 'name': 'cc'}]

和

dict2 = [{'name': 'aa', 'dtype': 'StringType'},
 {'name': 'bb', 'dtype': 'StringType'},
 {'name': 'xx', 'dtype': 'StringType'},
 {'name': 'cc', 'dtype': 'StringType'}]

需要基于共同键name合并这两个列表,保留dict1的所有条目,并匹配dict2中对应的dtype,得到预期结果:

merged_dict= [{'id': 1.0, 'name': 'aa', 'dtype': 'StringType'},
 {'id': 4.0, 'name': 'bb', 'dtype': 'StringType'},
 {'id': 2.0, 'name': 'cc', 'dtype': 'StringType'}]

尝试了以下嵌套循环但未得到预期结果:

for i in dict1:
    for j in dict2:
         j.update(i)

错误原因分析

你的代码逻辑存在问题:

  • 嵌套循环会把dict1里的每个字典全部更新到dict2的每一个字典中,不管name是否匹配,导致所有dict2的字典都会被覆盖成最后一个dict1的内容,同时还保留了不需要的xx条目。
  • 这种方式不仅效率低(时间复杂度O(n*m)),完全不符合按name匹配合并的需求。

正确解决方法

方法1:构建索引字典(高效)

先把dict2转换成以name为键的索引结构,实现O(1)时间查找匹配项,再遍历dict1合并:

# 构建dict2的name索引
dict2_index = {item['name']: item for item in dict2}

merged_dict = []
for item in dict1:
    # 合并当前条目与dict2中对应name的内容
    merged_item = {**item, **dict2_index.get(item['name'], {})}
    merged_dict.append(merged_item)

print(merged_dict)

方法2:修正嵌套循环

如果坚持用嵌套循环,需先判断name是否匹配,且创建新字典避免修改原数据:

merged_dict = []
for item1 in dict1:
    for item2 in dict2:
        if item1['name'] == item2['name']:
            # 合并两个字典并添加到结果列表
            merged_dict.append({**item1, **item2})
            # 匹配到就跳出内层循环,避免重复处理
            break

print(merged_dict)

方法3:列表推导式(简洁版)

结合索引字典用列表推导式实现,代码更简洁:

dict2_index = {item['name']: item['dtype'] for item in dict2}
merged_dict = [{'id': d['id'], 'name': d['name'], 'dtype': dict2_index[d['name']]} for d in dict1]

print(merged_dict)

以上三种方法都能得到预期结果,其中方法1的效率最高,适合数据量较大的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:35:17