如何在嵌套子列表构成的树形结构中查找指定值并修复代码死循环问题
原代码死循环原因
- 存在未定义变量:代码中判断逻辑引用了不存在的变量
gone,你实际定义的已检查集合变量是checked,变量名不匹配会先触发NameError,就算修正变量名,后续逻辑依然有问题。 - 循环无终止条件:整个
while True循环没有设置找不到目标值时的退出逻辑,只要没匹配到值就会永远运行。 - 路径记录逻辑错误:遇到非列表元素时直接清空
index_list,完全丢失了上层路径的记录,根本无法生成正确的索引链。 - 缺失回溯逻辑:遍历完一个子列表后没有正确回退到上层层级、也没有将上层的遍历索引向后移动,导致程序卡在当前层级反复执行,这是死循环的核心原因。
- 状态管理混乱:
cur变量的两个元素定义模糊,跨层级的状态切换逻辑完全错误,无法正确对应嵌套列表的层级遍历。
可正常运行的实现方案
递归实现(Python2/3通用,逻辑简洁)
递归是处理任意深度嵌套结构最直观的方案,符合树形结构的遍历特性:
def locate_value(target, nested_list): for index, item in enumerate(nested_list): if item == target: return [index] if isinstance(item, list): sub_path = locate_value(target, item) if sub_path is not None: return [index] + sub_path # 遍历完当前列表所有元素未找到,返回None return None # 测试用例 chrs = [[["a",["b","c"]],["d","e"],"f"],["g",[["h","i"],"j"]]] print(locate_value("e", chrs)) # 输出:[0, 1, 1]
该方案默认返回第一个匹配到的目标值的路径,如果目标值不存在会返回None,可根据需求调整不存在时的返回值。
迭代实现(避免递归深度限制,适合超深嵌套)
如果嵌套深度可能超过Python默认的递归深度(默认1000),可以用栈实现深度优先遍历的迭代版本:
def locate_value(target, nested_list): # 栈元素格式:(当前遍历的列表, 当前已记录的路径) stack = [(nested_list, [])] while stack: current_list, path = stack.pop() # 倒序遍历保证匹配顺序和递归版本一致,不需要可以去掉reversed for index, item in reversed(list(enumerate(current_list))): if item == target: return path + [index] if isinstance(item, list): stack.append((item, path + [index])) # 未找到返回None return None # 测试用例 chrs = [[["a",["b","c"]],["d","e"],"f"],["g",[["h","i"],"j"]]] print(locate_value("e", chrs)) # 输出:[0, 1, 1]
内容的提问来源于stack exchange,提问作者TheMystZ
相关产品推荐
相关产品推荐

