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

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,直到触发以下三种情况之一停止:

  1. 查到某ID的父ID等于2:将起始ID存入结果集
  2. 当前ID不存在对应的父ID记录:已到顶层未找到符合条件的节点,跳过
  3. 查找层级超过预设上限:存在循环引用,跳过
可运行代码
# 原始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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:51:03