You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确递归解析嵌套字典,获取键完整路径与对应值?

嵌套字典完整键路径提取问题解决方法

问题背景

给定如下嵌套字典数据:

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

原代码问题分析

你尝试的递归函数存在两个核心问题:

  1. 使用cache.clear()会清空整个缓存列表,导致处理完某个子键后,父级路径丢失,比如处理c.q后清空缓存,后续处理c.w时无法保留父键c。
  2. 递归时传递的是同一个列表引用,修改会影响父级的缓存状态,导致路径混乱。

正确实现方案

方案一:回溯法(弹出当前键恢复父级路径)

通过在处理完当前键后弹出该键,让缓存回到父级路径状态,确保后续子键能正确继承父级路径:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:35:17