Python遍历二维数组溯源ID父节点至指定超级父节点的实现问题
原代码问题分析
- 未提前建立ID到父ID的映射,每次查找父ID都依赖数组遍历,逻辑冗余且易出错
- 内层while循环通过
k = k-1的下标递减方式查找上级父ID,逻辑完全错误:数组下标和ID的层级没有任何关联,随机取下标对应的元素无法匹配真实的层级关系 - 未做循环防护,遇到ID循环引用(如A的父ID是B,B的父ID是A)时会触发死循环
- 终止条件判断错误:需求是终止在父ID等于2,原代码判断的是
j[0]!=superparent,也就是判断ID本身等于2,和需求不符
实现方案
首先先将二维数组转换为字典结构,key为ID,value为对应父ID,字典的O(1)查找特性可以大幅简化层级查询的逻辑,不需要再嵌套遍历数组。
之后遍历每个起始ID,循环向上查询父ID,直到触发以下三种情况之一停止:
- 查到某ID的父ID等于2:将起始ID存入结果集
- 当前ID不存在对应的父ID记录:已到顶层未找到符合条件的节点,跳过
- 查找层级超过预设上限:存在循环引用,跳过
可运行代码
# 原始ID-父ID数组 array = [[1, 2], [98,100], [2, 5], [100,150], [5, 6], [12,69], [6, 20], [20, 40], [69,420], [40, 60]] # 目标终止父ID superparent = 2 # 最大查找层级,防止循环引用死循环 max_depth = 100 # 存储符合条件的起始ID result = [] # 第一步:转换为ID到父ID的映射字典,大幅提升查找效率 id_to_parent = {item[0]: item[1] for item in array} # 遍历每个起始ID for start_id in id_to_parent: current_id = start_id depth = 0 is_match = False while depth < max_depth: # 当前ID没有对应的父ID记录,终止查找 if current_id not in id_to_parent: break # 获取当前ID的父ID parent_id = id_to_parent[current_id] # 父ID等于目标值,符合条件 if parent_id == superparent: is_match = True break # 向上迭代一级 current_id = parent_id depth += 1 if is_match: result.append(start_id) # 输出结果 print("符合条件的起始ID:", result) # 写入文件 with open('match_ids.txt', 'w', encoding='utf-8') as f: f.write('\n'.join(map(str, result)))
运行结果说明
针对你提供的示例数组,运行后符合条件的起始ID只有1,因为ID1的父ID直接是2,其余ID向上追溯都找不到父ID为2的节点,结果会同时打印到控制台和写入match_ids.txt文件。
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

