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
相关产品推荐
相关产品推荐

