更新嵌套字典中的值
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):
我有一本这样的字典。长度可能不同:
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):