如何将扁平化JSON键转换为嵌套字典路径以修改对应值
实现方案
方案1:手动遍历实现(兼容性最好,易扩展)
你可以通过拆分扁平化键为层级列表,逐层遍历到嵌套字典的最后一级父节点后赋值,该方案适配任意嵌套层数,也兼容单层键的场景。
示例代码如下:
# 初始数据 temp = {"a": {"b": {"c": 123}}} flat = "a.b.c" new_val = 456 # 通用嵌套字典赋值函数 def set_nested_value(data: dict, flat_key: str, value): # 拆分扁平化键为层级列表 keys = flat_key.split('.') current_node = data # 遍历到最后一级的父节点 for key in keys[:-1]: # 若需自动创建不存在的中间键,可放开下方注释代码 # if key not in current_node: # current_node[key] = {} current_node = current_node[key] # 给最终键赋值 current_node[keys[-1]] = value # 调用函数执行修改 set_nested_value(temp, flat, new_val) print(temp) # 输出:{'a': {'b': {'c': 456}}}
如果需要读取嵌套值,也可以用对应逻辑的取值函数:
def get_nested_value(data: dict, flat_key: str): keys = flat_key.split('.') current_node = data for key in keys: current_node = current_node[key] return current_node print(get_nested_value(temp, "a.b.c")) # 输出:456
方案2:基于functools.reduce实现(代码更简洁)
如果偏好简洁写法,可以用functools.reduce配合操作符快速实现:
from functools import reduce import operator def set_nested_value(data: dict, flat_key: str, value): keys = flat_key.split('.') # 直接获取最后一级的父节点 parent_node = reduce(operator.getitem, keys[:-1], data) parent_node[keys[-1]] = value def get_nested_value(data: dict, flat_key: str): return reduce(operator.getitem, flat_key.split('.'), data)
两种方案都支持任意嵌套层数的扁平化键,比如a.b.c.d.f或者单层的a都可以正常处理。
内容的提问来源于stack exchange,提问作者Itayst
相关产品推荐
相关产品推荐

