如何正确递归解析嵌套字典,获取键完整路径与对应值?
嵌套字典完整键路径提取问题解决方法
问题背景
给定如下嵌套字典数据:
input = { 'a': 3, 'b': {'g': {'l': 12}}, 'c': { 'q': 3, 'w': {'v': 3}, 'r': 8, 'g': 4 }, 'd': 4 }
需要提取每个最终值对应的完整键路径(键之间用.分隔),预期输出示例:
a: 3 b.g.l: 12 c.q: 3 c.w.v: 3 c.r: 8 c.g: 4 d: 4
原代码问题分析
你尝试的递归函数存在两个核心问题:
- 使用
cache.clear()会清空整个缓存列表,导致处理完某个子键后,父级路径丢失,比如处理c.q后清空缓存,后续处理c.w时无法保留父键c。 - 递归时传递的是同一个列表引用,修改会影响父级的缓存状态,导致路径混乱。
正确实现方案
方案一:回溯法(弹出当前键恢复父级路径)
通过在处理完当前键后弹出该键,让缓存回到父级路径状态,确保后续子键能正确继承父级路径:
from typing import Optional, Dict, Any def recursive_parse(data: Dict[str, Any], cache: Optional[list] = None): if cache is None: cache = [] for k in data: cache.append(k) # 处理当前键对应的值 if not isinstance(data[k], dict): print(f"{'.'.join(cache)}: {data[k]}") else: recursive_parse(data[k], cache) # 回溯:弹出当前键,恢复到父级路径 cache.pop()
方案二:传递缓存副本(避免修改原列表)
每次循环创建新的缓存列表(原缓存+当前键),递归时传递副本,确保每个路径独立不干扰:
from typing import Optional, Dict, Any def recursive_parse(data: Dict[str, Any], cache: Optional[list] = None): if cache is None: cache = [] for k in data: new_cache = cache + [k] if not isinstance(data[k], dict): print(f"{'.'.join(new_cache)}: {data[k]}") else: recursive_parse(data[k], new_cache)
测试结果
上述两种方案执行后,都会输出符合预期的完整键路径:
a: 3 b.g.l: 12 c.q: 3 c.w.v: 3 c.r: 8 c.g: 4 d: 4
内容的提问来源于stack exchange,提问作者PrefixEt
相关产品推荐
相关产品推荐

