想象一下下面的字典:
a = {'key1': {'subkey1': [1, 2, 3]}}
b = {'key1': {'subkey2': [1, 2, 3]}}我想把它们合并
c = {'key1': {'subkey1': [1, 2, 3],
'subkey2': [1, 2, 3]}}特别好的解决方案是从a和b返回深拷贝,我可以在不改变a或b的情况下修改它们。
c = {**a, **b}看起来不错,但似乎与c = copy(a).update(b)相同,在我的例子中,它返回与b相同的内容,因为key1会被更新覆盖。
当然,你可以这样做(在另一个答案中找到):
def combine_dict(map1: dict, map2: dict):
def update(d: dict, u: dict):
for k, v in u.items():
if isinstance(v, collections.Mapping):
r = update(d.get(k, {}), v)
d[k] = r
else:
d[k] = u[k]
return d
_result = {}
update(_result, map1)
update(_result, map2)
return _result但是我们现在有Python3.5了--也许事情已经变了?
发布于 2022-01-27 15:38:16
您需要递归来完成这一任务。幸运的是,GitHub上的微虫救了我们几个小时的工作和可能的脑损伤。
def deep_merge(dict1: dict, dict2: dict) -> dict:
""" Merges two dicts. If keys are conflicting, dict2 is preferred. """
def _val(v1, v2):
if isinstance(v1, dict) and isinstance(v2, dict):
return deep_merge(v1, v2)
return v2 or v1
return {k: _val(dict1.get(k), dict2.get(k)) for k in dict1.keys() | dict2.keys()}
a = {'key1': {'subkey1': [1, 2, 3]}}
b = {'key1': {'subkey2': [1, 2, 3]}}
a = deep_merge(a, b)
print(a)在以下方面的成果:
{'key1': {'subkey2': [1, 2, 3], 'subkey1': [1, 2, 3]}}https://stackoverflow.com/questions/39997469
复制相似问题