如何在networkx2.1,python3中构建将节点映射到其程度的字典?

时间:2018-11-14 00:56:38

标签: python python-3.x networkx

我尝试的是这里:

def comm_deg(G):
    nodes = G.nodes()
    A=nx.adj_matrix(G)
    deg_dict = {}
    n = len(nodes)  
    degree= A.sum(axis = 1)
    for i in range(n):
    deg_dict[nodes[i]] = degree[i,0]
    return deg_dict

它显示KeyError:0,我发现同时使用nodes[] degree[,]都会发生此问题

这是完整的错误消息:

> File "/Users/shaoyupei/Desktop/code/untitled1.py", line 25, in comm_deg
> deg_dict[nodes[i]] = degrees[i,0]

> File "/anaconda3/lib/python3.6/site-packages/networkx/classes/reportviews.py", line 178, in __getitem__
> return self._nodes[n]

> KeyError: 0

1 个答案:

答案 0 :(得分:1)

所以这里有几个问题。

首先,有一种比您正在做的更好的方法来创建字典。  实际上,它基本上已经内置了。G.degree已经是一个类似dict的对象,因此G.degree[node]的程度将为node

如果您真的希望将其作为命令,那么最好的方法可能就是

deg_dict = dict(G.degree)

现在让我们看看您遇到的错误。 G.nodes()不是列表(它也很像字典)。因此,当您设置nodes=G.nodes()时,nodes不是列表。在这里nodes[0]尝试返回节点0的属性(如果您的节点没有任何属性,nodes[node]将返回一个空字典)(这是有价值的)。但是(我相信)0不是图形G中的节点。这就是您的错误消息的含义。

此外,作为一般规则,如果您先做n=len(x),然后再做for i in range(n):,则几乎总是真的想做for name in x:,或者如果确实需要索引,则可以做for i, name in enumerate(x)

因此,如果您想使用自己的方法,

for i, node in nodes:
    deg_dist[node] = degree[i]