繁体   English   中英

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

[英]How can I iterate networkx edge data with functions that do not return an edge with key?

使用MultiGraph()。

试图找到使用在边缘上迭代但仅产生(src,dst)边缘而没有密钥的函数的networkx函数,并在循环内获取密钥。

例如: 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:元组索引超出范围

深度优先搜索只会看到给定节点的第一条边。 如果两个节点之间有两条边(因为这是一个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)边缘,又错过了(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]]

这只是从可能的选择中获取第一把钥匙。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM