Networkx节点和边缘索引和属性

时间:2017-06-22 21:46:09

标签: python networkx

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 , Eggssource = 0代替target = 1source = 5,我们如何继续获取输出target = 7

长问题

我也在寻求这些问题的答案,以便更好地理解为什么你的简短问题的解决方案有效。

  • 如果我们取消注释已注释掉的行,我们会看到类型为int,但src, tgt循环中的for是什么?节点对象或节点索引?
  • 表达式nodes = G.nodes(data=True)的类型为list。这是否意味着,如果我们将57替换为50000007000000,我们会建立一个这么久的列表吗?

1 个答案:

答案 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循环中,srctgt是节点名称/标识符。 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
相关问题