python - 合并词典与子词典

标签 python dictionary data-structures merge python-3.6

我想深度合并两个字典,它们在某种程度上都具有一个或多个具有相同键的字典值。我怎样才能简单地合并那些内部字典?类似于“**”符号,但深度合并。

示例:

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/

相关文章:

python - 如何在python中的多个字典列表中查找项目的累积总和

java - 设计数据结构以根据键组合选择值

data-structures - 代数方程的数据结构?

javascript - 我如何判断在 Django 中提交了这两种表单中的哪一种?

R spplot() 如何更改比例尺的单位类型

python - Pandas:识别范围内值的重叠成员资格

dictionary - Julia 中 Dict 和 Base.Iterators.Pairs 的区别

algorithm - 在 O(1) 中查找 bst 中的后继者和前驱者

python - 如何在给定参数列表的情况下动态创建 where 子句?

python - 如何从 PyPNG 的阅读器读取 itertools.imap 对象