我想深度合并两个字典,它们在某种程度上都具有一个或多个具有相同键的字典值。我怎样才能简单地合并那些内部字典?类似于“**”符号,但深度合并。
示例:
d1 = {"v1": "value1", "sub": {"sv1": "sub value 1"}}
d2 = {"v2": "value2", "sub": {"sv2": "sub value 2"}}
d3 = {**d1, **d2}
print(d3)
实际结果:
{'v1': 'value1', 'sub': {'sv2': 'sub value 2'}, 'v2': 'value2'}
期望的结果:
{'v1': 'value1',
'sub': {'sv1': 'sub value 1', 'sv2': 'sub value 2'},
'v2': 'value2'}
注意到sub -> sv1 -> sub value 1
这是一个简单的例子,实际案例还有几层字典。此外,由于事先不知道字典的结构,因此该解决方案必须是通用的。
最佳答案
我最终写了这个:
import collections
import copy
def deep_dict_merge(dct1, dct2, override=True) -> dict:
"""
:param dct1: First dict to merge
:param dct2: Second dict to merge
:param override: if same key exists in both dictionaries, should override? otherwise ignore. (default=True)
:return: The merge dictionary
"""
merged = copy.deepcopy(dct1)
for k, v2 in dct2.items():
if k in merged:
v1 = merged[k]
if isinstance(v1, dict) and isinstance(v2, collections.Mapping):
merged[k] = deep_dict_merge(v1, v2, override)
elif isinstance(v1, list) and isinstance(v2, list):
merged[k] = v1 + v2
else:
if override:
merged[k] = copy.deepcopy(v2)
else:
merged[k] = copy.deepcopy(v2)
return merged
关于python - 合并词典与子词典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45974706/