Python遍历类字典嵌套结构,实现根节点到各叶节点的路径追踪
问题根因
你代码出错主要是三个常见的Python递归踩坑点:
- 函数默认参数使用了可变对象
[],Python只会在函数定义时初始化一次可变默认参数,后续所有调用都会共享同一个列表对象,导致不同调用的路径数据串在一起 - 往
output里添加路径时直接添加了path的引用,后续修改path的时候,已经存入output的路径也会同步被修改 - 递归遍历完非叶子节点的所有子节点后,没有将当前节点名从路径中移除,导致同层级的后续节点路径会带上前一个节点的内容
修复后代码
def get_leaf_paths(input_list, output=None, path=None): # 避免可变默认参数的坑,每次调用如果没传就初始化新的空列表 if output is None: output = [] if path is None: path = [] for x in input_list: # 先把当前节点名加入路径 path.append(x.name) if not x.subfields: # 到叶子节点了,添加路径的副本到output,不要加原引用 output.append(path.copy()) else: # 非叶子节点递归遍历子字段 get_leaf_paths(x.subfields, output, path) # 处理完当前节点后回退路径,删掉当前节点名 path.pop() return output
运行验证
用你给出的示例输入调用:
print(get_leaf_paths(input_list))
输出和预期完全一致:
[['event_time'], ['song_name', 'username'], ['song_name', 'ip_address'], ['user_song_upload', 'misc_attrs', 'song_id'], ['user_song_upload', 'misc_attrs', 'song_length']]
内容的提问来源于stack exchange,提问作者snark17
相关产品推荐
相关产品推荐

