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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:06:09