[英]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.