我有两个嵌套的词典,我想将它们合并为一个(第二个dict覆盖第一个dict值)。我看到很多漂亮的解决方案,用于合并" flat" (不是嵌套的)词典,例如:
dict_result = dict1.copy()
dict_result.update(dict2)
或
dict_result = dict(dict1.items() + dict2.items())
或(我最喜欢的)
dict_result = dict(d1,**d2)
但无法找到合并多嵌套词组的最有效方法。
我试图避免递归。你的主张是什么?
答案 0 :(得分:9)
除非严格限制合并词典的深度,否则无法避免递归。 1)此外,没有bultin或库函数来执行此操作(也就是说,我不知道),但实际上并不是那么难。这样的事情应该做:
def merge(d1, d2):
for k in d2:
if k in d1 and isinstance(d1[k], dict) and isinstance(d2[k], dict):
merge(d1[k], d2[k])
else:
d1[k] = d2[k]
这样做:它迭代d2
中的密钥,如果密钥也可以在d1
中找到并且都是字典,则合并这些子字典,否则覆盖{{1}中的值来自d1
的那个。请注意,这会更改d2
及其子词典到位,因此您可能希望以前对其进行深层复制。
或使用此版本创建合并副本:
d1
示例:
def merge_copy(d1, d2):
return {k: merge_copy(d1[k], d2[k]) if k in d1 and isinstance(d1[k], dict) and isinstance(d2[k], dict) else d2[k] for k in d2}
1)你可以使用堆栈进行迭代,但这只会使事情变得更复杂,并且应该只是为了避免最大递归深度的问题。
答案 1 :(得分:0)
上述merge_copy
函数的修改版本,可以被认为是合并父级和子级,您希望父级继承子级的所有值以创建新的dict。
def merge_copy(child, parent):
'''returns parent updated with child values if exists'''
d = {}
for k in parent:
if k in child and isinstance(child[k], dict) and isinstance(parent[k], dict):
v = merge_copy(child[k], parent[k])
elif k in child:
v = child[k]
else:
v = parent[k]
d[k] = v
return d