-
代码:
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
- 背景信息:
可以看出,我有一个名为nested_dict的变量——实际上,它包含数百个元素,每个元素都有不同数量的子元素(为了这个例子,我正在简化它(。
我需要修改字典中某些元素的值,但具体是哪些元素还没有预先确定。具体的";路径";到需要修改的元素,将由access_pattern变量提供,每次都会有所不同。
- 问题:
我知道如何使用函数functools.reduce(dict.get, access_pattern, nested_dict)
引用字典的值。但是,我不知道如何在字典中普遍修改访问模式的值(无论包含的变量类型如何(。
所提供的代码产生了一个TypeError
,我不知道如何优雅地克服它。我确实想到了一些解决方案,在4中指定。
-
可能的解决方案:
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