如何递归遍历嵌套字典并验证指定路径是否存在?
问题分析与修复
先看你代码里的两个核心问题:
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
相关产品推荐
相关产品推荐

