def get_value_by_path(data, path):
current = data
for key in path:
if key not in current:
return None
current = current[key]
return current
def update_value_by_path(data, path, new_value):
current = data
for key in path[: -1]:
if key not in current:
current[key] = {}
current = current[key]
last_key = path[-1]
current[last_key] = new_value
# 测试
data = {'outer1': {'inner1': [1, 2, 3], 'inner2': {'sub1': 'value1'}}, 'outer2': {'inner3': 42}}
print(get_value_by_path(data, ['outer1', 'inner2','sub1']))
update_value_by_path(data, ['outer2', 'inner3'], 100)
print(data)
处理这类复杂嵌套结构时需要注意的要点:
- 键的存在性检查:在获取或更新值之前,需要检查每一级的键是否存在,避免
KeyError
。例如在get_value_by_path
函数中,每次访问下一级字典之前检查键是否存在;在update_value_by_path
函数中,在创建最后一级键之前,也需要检查中间各级键是否存在。
- 数据类型的兼容性:在更新值时,要确保新值的数据类型与原结构兼容。例如,如果原结构期望是一个字典,而传入的新值是一个整数,可能会导致程序逻辑错误。
优化方向:
- 异常处理的增强:可以考虑在函数中添加更详细的异常处理,例如除了
KeyError
,还可以处理类型错误等其他可能出现的异常情况,使函数更加健壮。
- 使用递归优化:对于非常深层次的嵌套结构,递归方式可能使代码更加简洁和易于理解。例如,可以通过递归函数来处理获取和更新值的逻辑,而不是使用当前的迭代方式。不过递归需要注意栈溢出的问题。
- 性能优化:对于大型嵌套结构,可以考虑缓存一些中间结果,避免重复查找,提高获取和更新值的效率。