更新嵌套字典中的值

Update value in nested dictionary

我有一本这样的字典。长度可能不同:

dct: dict = {'first': {'val1': {'subval1': 1, 'subval2': 555}, 'val2': 2, 'val3': 3}, 'second': {'val1': 1, 'val2': 2, 'val3': 3}}

我有一个值的“路径”和该值的新内容:

path = ['first', 'val1', 'subval1', 1000]

如何更改字典中的值? “路径”可以改变,其中的价值观也可以改变。可能是:

path = ['third', 'firstval', 'val3', 'subval2', 999]

或其他。

您可以编写一个递归函数来从您的路径创建字典,然后 update 您的初始字典:

my_dict = {'first': {'val1': {'subval1': 1, 'subval2': 555}, 'val2': 2, 'val3': 3}, 'second': {'val1': 1, 'val2': 2, 'val3': 3}}

update_path = ['first', 'val1', 'subval1', 1000]

def create_dict_from_path(l):
    if len(l) > 1:
        return {l[0]: create_dict_from_path(l[1:])}
    else:
        return l[0]

update_dict = create_dict_from_path(update_path)
my_dict.update(update_dict)

print(my_dict)

输出:

{'first': {'val1': {'subval1': 1000}}, 'second': {'val1': 1, 'val2': 2, 'val3': 3}}

编辑:如果您想一直到字典的最深层以保留所有 key/value 对,递归函数会更复杂一些:

def update_dict_from_path(d, l):
    if len(l) > 2 and l[0] in d:
        update_dict_from_path(d[l[0]], l[1:])
    elif len(l) == 2 and l[0] in d:
        d[l[0]] =  l[1]

update_dict_from_path(my_dict, update_path)
print(my_dict)

输出:

{'first': {'val1': {'subval1': 1000, 'subval2': 555}, 'val2': 2, 'val3': 3}, 'second': {'val1': 1, 'val2': 2, 'val3': 3}}

Edit2:您可能想检查一下您是否没有用标量值覆盖嵌套字典,以防在不同级别找到相同的键:elif len(l) == 2 and l[0] in d and not isinstance(d[l[0]], dict):