通过从列表生成的引用修改嵌套字典元素


  1. 代码:

    def main():
    nested_dict = {'A': {'A_1': 'value_1', 'B_1': 'value_2'},
    'B': 'value_3'}
    access_pattern = ['A', 'B_1']
    new_value = 'value_4'
    nested_dict[access_pattern] = new_value
    return nested_dict
    

  1. 背景信息:

可以看出,我有一个名为nested_dict的变量——实际上,它包含数百个元素,每个元素都有不同数量的子元素(为了这个例子,我正在简化它(。

我需要修改字典中某些元素的值,但具体是哪些元素还没有预先确定。具体的";路径";到需要修改的元素,将由access_pattern变量提供,每次都会有所不同。


  1. 问题:

我知道如何使用函数functools.reduce(dict.get, access_pattern, nested_dict)引用字典的。但是,我不知道如何在字典中普遍修改访问模式的值(无论包含的变量类型如何(。

所提供的代码产生了一个TypeError,我不知道如何优雅地克服它。我确实想到了一些解决方案,在4中指定。


  1. 可能的解决方案:

    if len(access_pattern) == 1:
    nested_dict[access_pattern[0]] = new_value
    elif len(access_pattern) == 2:
    nested_dict[access_pattern[0]][access_pattern[1]] = new_value
    ...
    So on for all len()
    

这看起来非常不雅和痛苦。有没有更实际的方法来实现这一点?

使用递归

def edit_from_access_pattern(access_pattern, nested_dict, new_value):
if len(access_pattern) == 1:
nested_dict[access_pattern[0]] = new_value
else:
return edit_from_access_pattern(access_pattern[1:], nested_dict[access_pattern[0], new_value]

您可以使用递归

def set_value(container, key, value):
if len(key) == 1:
container[key[0]] = value
else:
set_value(container[key[0]], key[1:], value)

但显式循环可能会更有效

def set_value(container, key, value):
for i in range(len(key)-1):
container = container[key[i]]
container[key[-1]] = value

最新更新