2017-06-22 565 views
0
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']) 

上面的代碼產生所需的,正確的輸出:Networkx節點和邊索引和屬性

0 - 1 : Breakfast : Ham , Eggs 

但是代碼是錯誤的。你可以看到代碼是錯誤的,用5/7代替0/1。

短缺問題

我們如何繼續,如果不是的source = 0target = 1我們使用source = 5target = 7獲得輸出Breakfast : Ham , Eggs

長的問題

我也在尋求這些問題的答案爲更好地理解爲什麼你的解決短缺問題的作品。

  • 如果我們取消對註釋掉線,我們看到,類型爲int,但什麼都在for循環src, tgt?節點對象或節點索引?
  • 表達式nodes = G.nodes(data=True)的類型爲list。這是否意味着如果我們用50000007000000來代替57,我們會建立一個這麼長的列表?
+0

該輸出是正確的。是什麼讓你覺得這是錯的?你會期待什麼? –

+0

@ValentinLorentz我的「它」含糊不清。它指的是代碼,而不是輸出。改寫。 – Calaf

+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 
+0

可能值得一提的是,節點本身必須是可散列的,因爲networkx將網絡存儲爲字典,其密鑰是節點並且其值包含關於網絡結構的數據。 – Joel

+0

確實。回答編輯,謝謝。 –

+0

有趣。令人費解的是,爲什麼'nodes = dict(G。節點(數據=真))'不是一個既定的習慣用法(或是否?)。 – Calaf