NetworkX:如何正确创建边长字典?

时间:2016-10-19 09:26:42

标签: python dictionary networkx

假设我有一个由10x10节点组成的常规网格网络,我这样创建:

import networkx as nx
from pylab import *
import matplotlib.pyplot as plt
%pylab inline

ncols=10 

N=10 #Nodes per side
G=nx.grid_2d_graph(N,N)
labels = dict( ((i,j), i + (N-1-j) * N ) for i, j in G.nodes() )
nx.relabel_nodes(G,labels,False)
inds=labels.keys()
vals=labels.values()
inds=[(N-j-1,N-i-1) for i,j in inds]
posk=dict(zip(vals,inds))
nx.draw_networkx(G, pos=posk, with_labels=True, node_size = 150, node_color='blue',font_size=10)
plt.axis('off')
plt.title('Grid')
plt.show()

现在说我要创建一个字典,为每个边缘存储它的长度。这是预期的结果:

d={(0,1): 3.4, (0,2): 1.7, ...}

这就是我试图达到这一点的方式:

from math import sqrt

lengths={G.edges(): math.sqrt((x-a)**2 + (y-b)**2) for (x,y),(a,b) in G.edges()}

但是当我收到以下错误消息时显然有问题:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-c73c212f0d7f> in <module>()
      2 from math import sqrt
      3 
----> 4 lengths={G.edges(): math.sqrt((x-a)**2 + (y-b)**2) for (x,y),(a,b) in G.edges()}
      5 
      6 

<ipython-input-7-c73c212f0d7f> in <dictcomp>(***failed resolving arguments***)
      2 from math import sqrt
      3 
----> 4 lengths={G.edges(): math.sqrt((x-a)**2 + (y-b)**2) for (x,y),(a,b) in G.edges()}
      5 
      6 

TypeError: 'int' object is not iterable

我缺少什么?

1 个答案:

答案 0 :(得分:1)

在最后一行中出现了很多问题,首先,G.edges()是一个迭代器,而不是一个有效的字典键,其次,G.edges()实际上只产生边缘,而不是节点的位置。

这就是你想要的:

lengths = dict()
for source, target in G.edges():
    x1, y1 = posk[source]
    x2, y2 = posk[target]
    lengths[(source, target)] = math.sqrt((x2-x1)**2 + (y2-y1)**2)