首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何进行“深度合并”?

如何进行“深度合并”?
EN

Stack Overflow用户
提问于 2016-10-12 11:29:19
回答 1查看 1.2K关注 0票数 5

想象一下下面的字典:

代码语言:javascript
复制
a = {'key1': {'subkey1': [1, 2, 3]}}
b = {'key1': {'subkey2': [1, 2, 3]}}

我想把它们合并

代码语言:javascript
复制
c = {'key1': {'subkey1': [1, 2, 3],
              'subkey2': [1, 2, 3]}}

特别好的解决方案是从ab返回深拷贝,我可以在不改变ab的情况下修改它们。

代码语言:javascript
复制
c = {**a, **b}

看起来不错,但似乎与c = copy(a).update(b)相同,在我的例子中,它返回与b相同的内容,因为key1会被更新覆盖。

当然,你可以这样做(在另一个答案中找到):

代码语言:javascript
复制
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了--也许事情已经变了?

EN

回答 1

Stack Overflow用户

发布于 2022-01-27 15:38:16

您需要递归来完成这一任务。幸运的是,GitHub上的微虫救了我们几个小时的工作和可能的脑损伤。

代码语言:javascript
复制
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)

在以下方面的成果:

代码语言:javascript
复制
{'key1': {'subkey2': [1, 2, 3], 'subkey1': [1, 2, 3]}}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39997469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档