首页 > 解决方案 > 通过引用修改嵌套字典元素,从列表生成

问题描述

  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)。但是,我不知道如何普遍修改(不管包含的变量类型)字典中access_pattern的值。

提供的代码会产生一个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()
    

这似乎非常不雅和痛苦。有没有更实用的方法来实现这一目标?

标签: pythonlistdictionaryreferencepass-by-reference

解决方案


您可以使用递归

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

推荐阅读