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

如何递归遍历嵌套字典并验证指定路径是否存在?

问题分析与修复

先看你代码里的两个核心问题:

1. 路径分割后产生无效空元素

你用'/a2/foo.bar'.split('/')得到的是['', 'a2', 'foo.bar'],第一个元素是空字符串,而字典里根本没有空键,所以第一步就直接返回None了。

2. 递归终止逻辑错误

当路径长度为0时,说明已经走到了目标节点,应该返回当前节点对应的值,但你的代码里只写了return(默认返回None),就算路径完全匹配,最后也拿不到结果。

另外还要加个边界判断:如果当前遍历的节点不是字典,那后续路径肯定不存在,直接返回None,避免报错。

修复后的代码

def verify_path(path, d):
    # 过滤路径中的空字符串,兼容开头/结尾带斜杠的情况
    cleaned_path = [p for p in path if p]
    if len(cleaned_path) == 0:
        # 路径走完,返回当前节点的值
        return d
    current_key = cleaned_path[0]
    if current_key not in d:
        return None
    next_node = d[current_key]
    # 如果还有剩余路径,但下一个节点不是字典,说明路径无效
    if len(cleaned_path) > 1 and not isinstance(next_node, dict):
        return None
    # 递归处理剩余路径
    return verify_path(cleaned_path[1:], next_node)

def main():
    d = {
        'a1': {
            'b1': { 'asdf.txt': 10 },
            'b2': {
                'c1': {'qwerty.pdf': 1},
            }
        },
        'a2': {'foo.bar': 99},
        'a3': {
            'b3': {
                'c2': {'img.heic': 100}, 
            },
        },
    }
    # 测试正确路径
    print(verify_path('/a2/foo.bar'.split('/'), d))  # 输出99
    # 测试不存在的路径
    print(verify_path('/a1/b2/c2'.split('/'), d))  # 输出None
    # 测试中间节点非字典的无效路径
    print(verify_path('/a2/foo.bar/x'.split('/'), d))  # 输出None

if __name__ == "__main__":
    main()

关键修正说明

  • 路径清理:自动过滤空字符串,不管路径是/a/b/c还是a/b/c/都能正确处理。
  • 终止条件优化:路径走完时返回当前节点的值,比如匹配到foo.bar时,直接返回对应的99。
  • 类型校验:如果剩余路径还有元素,但当前节点不是字典,直接返回None,避免非字典对象查找键的报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:20:33