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

Python递归遍历嵌套字典未输出预期层级路径如何解决

字典递归遍历返回空结果的修复方案

原代码问题点

你写的递归函数存在几个逻辑错误,直接导致运行结果不符合预期:

  • 缩进错误:depth += 1 这行没有缩进在函数体内部,运行直接报语法错误
  • 初始分支永远无法触发:你写的if depth == 0初始化逻辑,只有初始调用函数时手动传depth=-1才会进入,常规传参根本碰不到这个分支,breadcrumb无法正确初始化,很容易出空值或者未定义错误
  • 列表引用的副作用:breadcrumb是可变列表,递归时直接传递原对象,遍历完一个子分支后没有弹出当前节点key,会把其他分支的路径混在一起
  • 冗余逻辑干扰:额外加的olddepth参数完全没必要,递归遍历嵌套字典只需要记录当前走到的路径即可,不需要反复比对深度差
  • 鲁棒性不足:没有判断value的类型就直接递归调用,后续如果字典里存了非字典类型的值(比如字符串、数字)会直接抛属性错误

可直接运行的修正代码

不需要多余的深度、旧深度参数,递归时传递当前路径即可,代码如下:

def get_folder_paths(folder_dict: dict, current_path: list = None) -> list:
    # 初始化当前路径,避免可变默认参数的坑
    if current_path is None:
        current_path = []
    result = []
    for folder_name, sub_folders in folder_dict.items():
        # 拼接当前节点的完整路径
        current_node_path = current_path + [folder_name]
        # 存储当前节点路径,如果不需要根级单节点路径,把下面判断改成 len(current_node_path)>=2 即可
        result.append(current_node_path)
        # 如果有子文件夹,递归遍历,结果合并到总结果里
        if isinstance(sub_folders, dict) and sub_folders:
            result.extend(get_folder_paths(sub_folders, current_node_path))
    return result


# 测试用例(就是你提供的示例字典)
test_folders = {
    "01_timelines": {
        "00_data-managment": {},
        "01_rush-and-spot": {}
    },
    "02_source": {
        "00_from_external": {
            "01_fonts": {},
            "02_logos": {},
            "03_graphics": {},
            "04_video": {},
            "05_3d": {}
        },
        "01_imported_projects": {}
    }
}

# 打印所有路径
for path in get_folder_paths(test_folders):
    print(path)

运行效果

执行后输出如下,和你要求的格式完全匹配:

['01_timelines']
['01_timelines', '00_data-managment']
['01_timelines', '01_rush-and-spot']
['02_source']
['02_source', '00_from_external']
['02_source', '00_from_external', '01_fonts']
['02_source', '00_from_external', '02_logos']
['02_source', '00_from_external', '03_graphics']
['02_source', '00_from_external', '04_video']
['02_source', '00_from_external', '05_3d']
['02_source', '01_imported_projects']

如果不需要输出根目录下的一级节点路径(比如['01_timelines']、['02_source']),只需要把代码里加入结果的判断条件改成if len(current_node_path) >= 2,输出就和你给的示例完全一致。

内容的提问来源于stack exchange,提问作者Marcuzzz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:33:19