python - 通过引用修改嵌套字典元素,从列表生成
问题描述
编码:
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)
。但是,我不知道如何普遍修改(不管包含的变量类型)字典中access_pattern的值。
提供的代码会产生一个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 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
推荐阅读
- python - 读取 Excel 文件并跳过空行
- python - Pandas - 带有字典的列表到数据框
- python - 如何从文本文件中随机选择具有特定条件的 Python 行
- jms - WARN: 网络上有多个服务器广播相同的节点 ID
- eclipse - 为什么make实用程序找不到头文件?
- javascript - 为什么在这种情况下`this`很重要?
- asp.net-core - 如何使用 AddJwtBearer 获取最新的用户信息
- python - AttributeError: 'xml.etree.ElementTree.Element' 对象没有属性 'children'
- sql - 检索 SQL JSON 对象和数组中的数据
- php - 使用文件存储库时无法让 Composer 加载类