Python中如何按name、age字段合并两个存储字典的列表
解决方案
核心思路是使用(name, age)元组作为唯一匹配键,利用Python字典内置的update()方法自动合并键值对,无需手动判断每个字段,灵活性更高:
可直接运行的代码
a = [{'name': 'Helen', 'age': '12', 'total_money':'12000'}, {'name': 'Victor', 'age':'20', 'total_money': '32999'}] b = [{'name': 'Helen', 'age': '12', 'total_gold':'14'}] # 用(name, age)作为唯一键存储合并结果 merge_map = {} # 先处理第一个列表的所有条目 for item in a: key = (item['name'], item['age']) merge_map[key] = item.copy() # 拷贝避免修改原列表中的字典 # 再处理第二个列表的所有条目 for item in b: key = (item['name'], item['age']) if key in merge_map: # 匹配到就合并两个字典的所有键值对 merge_map[key].update(item) else: # 未匹配到直接新增 merge_map[key] = item.copy() # 提取结果为列表 output = list(merge_map.values()) print(output)
运行后输出完全符合预期:
[{'name': 'Helen', 'age': '12', 'total_money': '12000', 'total_gold': '14'}, {'name': 'Victor', 'age': '20', 'total_money': '32999'}]
原有代码问题说明
你原来的实现存在两个明显问题:
- 硬编码判断
total_money、total_gold字段,扩展性极差,后续新增其他字段就要改代码 - 逻辑判断
if data[key]["total_money"] in data[key]完全错误,你是在判断total_money的值是不是字典的键,和需求完全不符
更简洁的Python 3.9+写法
如果你的Python版本 >=3.9,可以用字典合并运算符简化代码:
merge_map = {(item['name'], item['age']): item for item in a} for item in b: key = (item['name'], item['age']) merge_map[key] = merge_map.get(key, {}) | item output = list(merge_map.values())
内容的提问来源于stack exchange,提问作者daniel8x
相关产品推荐
相关产品推荐

