首页 > 解决方案 > 如何构建一个字典,将节点映射到networkx2.1,python3中的程度?

问题描述

我尝试的是在这里:

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

标签: pythonpython-3.xnetworkx

解决方案


所以这里有几个问题。

首先,有一种比你正在做的更好的方法来创建一个 dict。事实上,它基本上已经内置了。 G.degree已经是一个类似字典的对象,所以这G.degree[node]将给出node.

如果您真的希望它成为一个字典,那么最好的方法可能是

deg_dict = dict(G.degree)

现在让我们看看你得到的错误。 G.nodes()不是一个列表(它也是类似 dict 的东西)。所以当你设置nodes=G.nodes(), thennodes不是一个列表。在这里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]

推荐阅读