[英]The best way to merge multi-nested dictionaries in Python 2.7
我有两个嵌套的字典,我想将它们合并为一个(第二个字典覆盖第一个dict值)。 我看到了许多用于合并“扁平”(非嵌套)词典的漂亮解决方案,例如:
dict_result = dict1.copy()
dict_result.update(dict2)
要么
dict_result = dict(dict1.items() + dict2.items())
或(我最喜欢的)
dict_result = dict(d1,**d2)
但找不到合并多嵌套dicts的最有效方法。
我试图避免递归。 你的命题是什么?
除非严格限制合并词典的深度,否则无法避免递归。 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
找到并且都是字典,则合并这些子字典,否则用d2
的值覆盖d1
的值。 注意这改变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}
例:
>>> d1 = {"foo": {"bar": 23, "blub": 42}, "flub": 17}
>>> d2 = {"foo": {"bar": 100}, "flub": {"flub2": 10}, "more": {"stuff": 111}}
>>> merge(d1, d2)
>>> print d1
{'foo': {'bar': 100, 'blub': 42}, 'flub': {'flub2': 10}, 'more': {'stuff': 111}}
1)您可以使用堆栈进行迭代,但这只会使事情变得更复杂,并且应该只是为了避免最大递归深度的问题。
用于merge_copy
的上述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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.