如何在 Python 中更新嵌套字典,同时保留不同深度的特定值?

Linda Hamilton
发布: 2024-11-12 03:58:02
原创
1037 人浏览过

How to Update a Nested Dictionary in Python While Preserving Specific Values at Different Depths?

具有深度保留的嵌套字典更新

在 Python 中,更新嵌套字典可能很棘手,特别是当您想要将其内容与另一个字典,同时保留不同深度的特定值。考虑以下场景:

给定两个字典,dictionary1 和 update,我们如何使用 update 的内容更新dictionary1,而不覆盖最深级别的特定值(例如“levelA”),同时更新所有其他值?

dictionary1 = {
    "level1": {
        "level2": {"levelA": 0, "levelB": 1}
    }
}
update = {
    "level1": {
        "level2": {"levelB": 10}
    }
}
登录后复制

如果我们简单地使用 update 方法,它会覆盖整个“level2”子词典,丢失“levelA”值:

dictionary1.update(update)
print(dictionary1)
登录后复制
{
    "level1": {
        "level2": {"levelB": 10}
    }
}
登录后复制

解决这个挑战,我们需要一个递归解决方案,考虑字典的可变深度并适当地合并值。

递归解决方案:

以下代码实现了递归“部分更新”更新字典值而不覆盖指定键的函数:

import copy

def partial_update(d, u, preserve):
    for k, v in u.items():
        if isinstance(v, dict):
            if d.get(k, None) is None:
                d[k] = copy.deepcopy(v)
            else:
                partial_update(d[k], v, preserve)
        elif k in preserve:
            continue
        else:
            d[k] = copy.deepcopy(v)
    return d
登录后复制

partial_update 函数采用三个参数:

  • d:要更新的字典
  • u:包含更新的字典
  • preserve:要防止覆盖的键列表

要保留示例中的“levelA”值,我们可以使用以下代码:

partial_update(dictionary1, update, ["levelA"])
print(dictionary1)
登录后复制
{
    "level1": {
        "level2": {"levelA": 0, "levelB": 10}
    }
}
登录后复制

在此解决方案中,我们在更新之前制作字典的副本,以防止意外修改。这确保了即使在部分更新后原始词典也保持不变。

以上是如何在 Python 中更新嵌套字典,同时保留不同深度的特定值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板