首页  >  文章  >  后端开发  >  如何在 Python 中更新嵌套字典,同时保留不同深度的特定值?

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

Linda Hamilton
Linda Hamilton原创
2024-11-12 03:58:021002浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn