查询无向networkx图中的无向边缘对象

时间:2018-08-07 01:59:40

标签: networkx

给出networkx中的无向图:

graph=Graph()
graph.add_edge(1,2)
graph.add_edge(2,3)

使用方法graph.edges()查询此图的边缘集时,结果将以元组的形式返回,即边缘集的 directed 视图。在上面的示例中,graph.edges()返回:

  

[(1,2),(2,3)]

如果我要查询入射到顶点2(graph.edges(2))的所有边,则会得到不同的有向视图:

  

[(2,1),(2,3)]

例如,如果我有一个将边缘(键)映射到其他对象的外部字典,则此行为是有问题的。例如:

lookup={edge : some_object(edge) for edge in graph.edges()}
for edge in graph.edges(2):
  print(lookup(edge)) #throws key not found exception

由于键(1,2)存在而引发异常,但(2,1)不存在。在networkx中的无向图上进行迭代时,获取无向对象的最佳方法(高效/ pythonic / ...)是什么?我可以将some_object(edge)与edge作为其属性之一关联,但这并不能真正回答问题。

1 个答案:

答案 0 :(得分:0)

dfs_labeled_edges(G,源)使用深度优先搜索遍历图形。 由于dfs_edges在到达每个节点后都会停止,因此不会总是检测到每个边缘。相反,可以实现dfs_labeled_edges以获得无向图中的所有边缘对象。

代码:

import networkx as nx
from networkx import dfs_labeled_edges

nodes = [1,2,3]
edges = [(1,2), (2,3)]
G = nx.Graph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)

undirectedGraphEdges = []

dfs = list(dfs_labeled_edges(G,1))

for edge in dfs:
    if(edge[:2] not in undirectedGraphEdges):
    undirectedGraphEdges.append(edge[:2])

if undirectedGraphEdges[0] not in edges:
    del undirectedGraphEdges[0]


print(undirectedGraphEdges)

# [(1, 2), (2, 1), (2, 3), (3, 2)]