NetworkX是否有更高效的方法获取有向图中某节点的所有直接关联节点(含入边和出边)?
NetworkX是否有更高效的方法获取有向图中某节点的所有直接关联节点(含入边和出边)?
你的实现思路完全没问题,但NetworkX其实提供了一个更简洁的内置方法来一步完成这个需求——nx.all_neighbors(),专门用来获取有向图中节点的所有直接关联节点(包含入边的前驱节点和出边的后继节点)。
简化后的代码示例
import networkx as nx # 构建示例有向图 G = nx.DiGraph() G.add_edges_from([ ('A','B'), ('B','C'), ('C','D'), ('D','E'), ('F','B'), ('B','G'), ('B','D'), ]) # 获取节点'B'的所有直接关联节点 node = 'B' neighbours = list(nx.all_neighbors(G, node)) print(neighbours) # 输出结果:['A', 'F', 'C', 'G', 'D']
关于这个方法的说明
- 功能层面:
nx.all_neighbors()在处理有向图时,会自动合并G.predecessors(node)和G.successors(node)的结果,和你手动拼接的逻辑完全一致。 - 效率层面:它的内部实现本质上也是分别遍历前驱和后继节点再合并,和你的写法效率相差无几,但胜在代码更简洁、可读性更强,省去了手动写列表推导式和拼接的步骤。
- 内存优化:如果不需要将结果存储为列表,直接使用
nx.all_neighbors(G, node)返回的迭代器即可,还能节省内存占用。
备注:内容来源于stack exchange,提问作者Robert Alexander




