如何合并两个字典列表?相同键的数值需累加并保留关联名称
问题描述
给定两个字典列表:
list_of_dicts = [{'a': 1, 'name1': "jane"}, {'b': 2, 'name1': 'jack'}, {'c': 3, 'name1': 'nak'},{'d': 3, 'name1': 'nak'}] dict_to_check = [{'a': 1, 'name2': "jone"}, {'b': 2, 'name2': 'doe'}, {'d': 3, 'name2': 'nick'}]
需要得到如下输出:
[ {'a': 2, 'name1': "jane", 'name2': "jone"}, {'b': 4, 'name1': 'jack','name2': 'doe'}, {'c': 3, 'name1': 'nak'}, {'d': 6, 'name1': 'nak','name2': 'nick'} ]
解决方案
可以通过构建临时索引字典的方式高效完成合并与数值累加,具体实现如下:
list_of_dicts = [{'a': 1, 'name1': "jane"}, {'b': 2, 'name1': 'jack'}, {'c': 3, 'name1': 'nak'},{'d': 3, 'name1': 'nak'}] dict_to_check = [{'a': 1, 'name2': "jone"}, {'b': 2, 'name2': 'doe'}, {'d': 3, 'name2': 'nick'}] # 把list_of_dicts转成以唯一标识键(a/b/c/d)为key的字典,方便快速查找 temp_map = {} for item in list_of_dicts: # 提取每个字典里除name1外的唯一键 key = next(k for k in item if k != 'name1') temp_map[key] = item.copy() # 遍历dict_to_check,合并匹配项 for item in dict_to_check: key = next(k for k in item if k != 'name2') if key in temp_map: # 累加对应数值 temp_map[key][key] += item[key] # 添加name2字段 temp_map[key]['name2'] = item['name2'] # 将处理后的字典转换为列表 result = list(temp_map.values()) print(result)
逻辑说明
- 第一步先把
list_of_dicts转换成以唯一标识键为索引的字典temp_map,避免后续反复遍历列表,提升匹配效率。 - 遍历
dict_to_check时,提取每个字典的唯一标识键,若该键存在于temp_map中,就执行数值累加操作,并将name2字段合并到目标字典。 - 最后把
temp_map的所有值转换为列表,即可得到预期结果。
内容的提问来源于stack exchange,提问作者tree em
相关产品推荐
相关产品推荐

