如何使用不使用键返回边缘的函数迭代networkx边缘数据?

时间:2015-05-15 02:00:27

标签: python graph networkx edges

使用MultiGraph()。

试图找到使用networkx函数迭代边但只生成(src,dst)边而没有键并获取循环内的键。

例如:networkx.dfs_edges()

迭代深度优先生成(src,dst)元组的边缘。

该函数不接受keys=True参数。

因此,在循环中,以下内容具有不同的行为:

g.get_edge_data(edge)

import networkx as nx
# This works with keys
g = nx.MultiGraph()
g.add_edge(1,2)
for edge in g.edges_iter(keys=True):
    print g.get_edge_data(*edge)
  

{}

# This gets the dict with the edge key, as the function doesn't take `keys=True` as arguments.
for edge in nx.dfs_edges(g):
    print g.get_edge_data(*edge)
  

{0:{}}

是否可以使用这些函数进行类似的迭代?

在这个特定的例子中,我希望能够get_edge_data来自dfs_edges给出的边缘的特定边缘,而不是获得所有字典的多边缘可以产生在2个节点之间Multi<Di>Graph

# eg: This works.
for edge in g.edges_iter(keys=True):
    print  g.edge[edge[0]][edge[1]][edge[2]]
  

{}

# But can't do something similar with `dfs_edge` as I lack the key information.
for edge in nx.dfs_edges(g):
    print  g.edge[edge[0]][edge[1]][edge[2]]
  

IndexError:元组索引超出范围

1 个答案:

答案 0 :(得分:0)

深度优先搜索只会看到给定节点的第一条边。如果两个节点之间有两条边(因为它&#39; sa MultiGraph),或者甚至只有通过不同节点到同一节点的多条路径,它只会返回遇到的第一条边。

因此,如果你有

G=nx.MultiGraph()
G.add_edges_from([(1,2),(1,2),(1,2),(2,3),(3,4),(1,4)])
G.edges()
> [(1, 2), (1, 2), (1, 2), (1, 4), (2, 3), (3, 4)]
for edge in nx.dfs_edges(G,1): #depth first search starting with node 1.
    print edge
> (1, 2)
> (2, 3)
> (3, 4)

它不会返回网络的每个边缘。请注意,例如,(1,4)和两个(1,2)边不会返回。如果我们从4开始进行深度优先搜索:

for edge in nx.dfs_edges(G,4):
    print edge
> (4, 1)
> (1, 2)
> (2, 3)

错过了(3,4)(1,2)两个边缘。

因此他们没有包含返回边缘键的选项的原因是因为实际上没有理由要求它返回密钥。它只会返回其中一条边。

从你的问题来看,看起来你期望它遍历每个边缘,而不仅仅是在dfs中交叉的边缘子集。如果您可以说出我所定义的G所需的输出,我可以尝试生成该功能。但就目前而言,你可以做到

for edge in nx.dfs_edges(G):
    edgekeys = G.edge[edge[0]][edge[1]].keys()
    print  G.edge[edge[0]][edge[1]][edgekeys[0]]

只从可能的选择中获取第一个键。