如何合并源自JSON文件的两个字典的特定特性且不覆盖原有值?
你的实现方式完全可行,还有更灵活的优化方案
首先得说,你现在写的代码完全能满足需求:
for x,y in zip(A,B): x["g"]= y["g"] x["k"]= y["k"]
它会逐个对应遍历A和B里的字典,把B中每个字典的g、k键值对加到A的对应字典里,而且因为你只新增A原本没有的键,完全不会覆盖A里已有的a、b、f值,完美符合你“仅合并指定特性、不覆盖原有值”的要求。
更灵活的优化方案
如果以后需要合并的字段变多,一个个手动赋值就有点麻烦了,推荐用字典的update()方法配合字典推导式,只提取B中你需要的字段:
# 先定义好要合并的字段列表 fields_to_merge = ["g", "k"] for x, y in zip(A, B): # 从y里挑出指定字段,再批量更新到x中 x.update({key: y[key] for key in fields_to_merge})
这种写法的好处很明显:
- 扩展性强:以后要加新的合并字段,只需要往
fields_to_merge里加元素就行,不用改循环里的代码 - 代码更简洁,读起来也更清晰,一眼就能知道要合并哪些字段
额外提醒:处理列表长度不一致的情况
如果A和B的列表长度不一样,zip()会以较短的那个为准,超出长度的元素不会被处理。如果你的场景里可能出现这种情况,可以用itertools.zip_longest来处理,记得判断B的元素是否存在:
from itertools import zip_longest fields_to_merge = ["g", "k"] for x, y in zip_longest(A, B): if y is not None: x.update({key: y[key] for key in fields_to_merge}) # 如果B比A短,这里可以根据你的需求给x加默认值或者做其他处理
内容的提问来源于stack exchange,提问作者user18774110
相关产品推荐
相关产品推荐

