import networkx as nx
G = nx.DiGraph()
source = 0
target = 1
G.add_node(source, name='Ham')
G.add_node(target, name='Eggs')
G.add_edge(source, target, meal='Breakfast')
nodes = G.nodes(data=True)
for src, tgt, attr in G.edges(data=True):
# print type(node1)
src_id, src_attr = nodes[src]
tgt_id, tgt_attr = nodes[tgt]
print(str(src) + ' - ' + str(tgt) + ' : ' + attr['meal']
+ ' : ' + src_attr['name'] + ' , ' + tgt_attr['name'])
上面的代码产生了所需的正确输出:
0 - 1 : Breakfast : Ham , Eggs
但代码错了。您可以通过将5/1替换为5/7来查看代码错误。
简短问题
如果我们使用Breakfast : Ham , Eggs
和source = 0
代替target = 1
和source = 5
,我们如何继续获取输出target = 7
?
长问题
我也在寻求这些问题的答案,以便更好地理解为什么你的简短问题的解决方案有效。
int
,但src, tgt
循环中的for
是什么?节点对象或节点索引?nodes = G.nodes(data=True)
的类型为list
。这是否意味着,如果我们将5
和7
替换为5000000
和7000000
,我们会建立一个这么久的列表吗?答案 0 :(得分:0)
您可以通过G.node
访问节点的属性:
for src, tgt, attr in G.edges(data=True):
# print type(node1)
src_attr = nodes[src]
tgt_attr = nodes[tgt]
print(str(src) + ' - ' + str(tgt) + ' : ' + attr['meal']
+ ' : ' + src_attr['name'] + ' , ' + tgt_attr['name'])
在for循环中,src
和tgt
是节点名称/标识符。 networkx没有节点对象的概念,它直接操作名称/标识符。
G.nodes(data=True)
返回的列表长度等于节点数。
由于节点名称/标识符可以是任意类型,如果x
是字符串,则创建大小为x
的列表是没有意义的。
以下是字符串是节点名称/标识符的示例:
import networkx as nx
G = nx.DiGraph()
source = 'foo'
target = 'bar'
G.add_node(source, name='Ham')
G.add_node(target, name='Eggs')
G.add_edge(source, target, meal='Breakfast')
for src, tgt, attr in G.edges(data=True):
# print type(node1)
src_attr = G.node[src]
tgt_attr = G.node[tgt]
print(str(src) + ' - ' + str(tgt) + ' : ' + attr['meal']
+ ' : ' + src_attr['name'] + ' , ' + tgt_attr['name'])
输出:
foo - bar : Breakfast : Ham , Eggs