首页 > 解决方案 > Python嵌套字典更新任何嵌套键匹配的值

问题描述

我有一个嵌套字典,其中每个元素都可以是任何类型,包括列表或字典。我正在寻找一种方法来使用特定值更新任何深度的任何键。(因此,如果目标值不是列表或字典,则会发生替换)

例如

{
   'a': 1,
   'b': 2,
   'c': [{'a': 2, 'b': 3}],
   'd': [{'d_d': {'a': 1, 'b': 2}}],
   'e': {'a': 4},
}

会成为

{
   'a': 'xx',
   'b': 2,
   'c': [{'a': 'xx', 'b': 3}],
   'd': [{'d_d': {'a': 'xx', 'b': 2}}],
   'e': {'a': 'xx'},
}

函数采用字典、键和新值,就像这样

update_nested(dict, key='a', value='xx')

标签: pythonpython-3.x

解决方案


让我们看看您需要哪些部分以及如何实现它们:

遍历字典

有三种不同的方法可以帮助您遍历字典:

dict.keys()

遍历字典中的所有键。例如

for key in {"Hello": 10, "World", 20}.keys():
   print(k)
# output: Hello\nWorld

dict.items()

遍历(key, value)字典中的所有元组。for k, v in d.items()

dict.values()

遍历字典中的所有值。for v in d.values()

处理嵌套字典

当您有嵌套结构时,一个好的概念将递归

简而言之:您使用不同的参数调用同一函数本身。

把这两个概念放在一起。

  • 遍历数组
  • 如果键与您要搜索的键相同:替换值
  • 如果值是字典:再次调用函数,将值作为字典参数
  • 如果值是一个列表:遍历所有项目并检查它们是否是 dicts。如果是这样,像上面一样处理它们

可能的最终代码:

def update_nested(in_dict, key, value):
   for k, v in in_dict.items():
       if key == k:
           in_dict[k] = value
       elif isinstance(v, dict):
           update_nested(v, key, value)
       elif isinstance(v, list):
           for o in v:
               if isinstance(o, dict):
                   update_nested(o, key, value)

额外说明:

您永远不应该使用内置名称/类型作为变量名。在你的情况下dict。这将覆盖内置类型并可能导致意外行为。


推荐阅读