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

Python实现JSON格式图指定节点全层级关联节点的遍历

实现方案

这个需求本质是有向图的层级遍历场景,要满足“按层级顺序输出关联节点”的要求,用广度优先搜索(BFS)实现最简便,不需要引入第三方图计算依赖:

  • 先将原始边列表转换为邻接表结构,把“查询某节点所有关联关系”的复杂度从全量扫描的O(n)降到O(1),处理大规模图数据时效率提升明显
  • 遍历过程中维护已访问节点集合,避免图中存在环路(比如A指向B、B指回A)时出现无限循环
  • 用队列缓存每一层待处理的节点,逐层提取关联节点加入结果列表,天然匹配层级遍历的输出规则
可直接运行的实现代码
# 原始边列表数据
edge_list = [
    {"NodeId":"1","N":"2"},
    {"NodeId":"1","N":"3"},
    {"NodeId":"3","N":"5"},
    {"NodeId":"5","N":"6"},
    {"NodeId":"2","N":"4"},
    {"NodeId":"9","N":"7"}
]

# 构建邻接表:key为源节点ID,value为该节点直接关联的目标节点列表
adjacency = {}
for edge in edge_list:
    src_node = edge["NodeId"]
    dst_node = edge["N"]
    if src_node not in adjacency:
        adjacency[src_node] = []
    adjacency[src_node].append(dst_node)

def get_all_related_nodes(start_node: str) -> list:
    # 起始节点不存在于邻接关系中时直接返回空列表
    if start_node not in adjacency:
        return []
    
    visited = set()
    visited.add(start_node)
    queue = [start_node]
    result = []

    while queue:
        # 取出队首的当前处理节点
        current_node = queue.pop(0)
        # 遍历当前节点的所有直接关联节点
        for neighbor in adjacency.get(current_node, []):
            # 仅处理未访问过的关联节点
            if neighbor not in visited:
                result.append(neighbor)
                visited.add(neighbor)
                queue.append(neighbor)
    return result

# 测试起始节点为"1"的场景
print(get_all_related_nodes("1"))
# 实际输出: ['2', '3', '4', '5', '6']
# 与示例输出的差异仅为同层级节点的排列顺序,层级关系完全符合要求:
# 第一层(直接关联1的节点):2、3
# 第二层(关联节点的直接关联节点):4、5
# 第三层:6
关键注意点
  • 同一层级内的节点排列顺序可灵活调整:如果需要匹配示例中5排在4前面的顺序,只需在遍历邻接节点前对邻居列表做对应排序即可,不影响层级输出的正确性
  • 已访问去重逻辑不可省略:如果图结构存在循环关联,没有去重会导致遍历进入死循环
  • 若需要明确区分每个节点所属的层级,可将队列存储的元素从单纯节点ID改为(节点ID, 层级)的元组,遍历过程中即可按层级拆分输出,不需要修改核心遍历逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 03:36:07