使用Python中的Networkx库获取图中每个节点的度数

12

假设我有一个数据集,如下所示,显示一个无向图:

1   2
1   3
1   4
3   5
3   6
7   8
8   9
10  11

我有一个像这样的 Python 脚本:

for s in ActorGraph.degree():
    print(s)

这是一个由键和值组成的字典,其中键是节点名称,值是节点的度数:

('9', 1)
('5', 1)
('11', 1)
('8', 2)
('6', 1)
('4', 1)
('10', 1)
('7', 1)
('2', 1)
('3', 3)
('1', 3)
networkx 文档中建议使用 values() 来获取节点的度数。我现在想要仅获取节点度数作为键,我使用下面这段代码,但它出现了“object has no attribute 'values'”的错误提示:
for s in ActorGraph.degree():
        print(s.values())

我该怎么做?

3个回答

27

您正在使用版本2.0的networkx。它从使用G.degree()中的dict改为使用类似于字典但不是字典的DegreeView。请参见此指南

若要将度数作为列表,请使用列表推导式

degrees = [val for (node, val) in G.degree()]

3
我想补充一点:如果你用nx.Graph()初始化无向图,然后再添加边,请注意networkx不能保证节点的顺序将被保留 -- 这也适用于degree()。这意味着,如果您使用列表推导式方法,然后尝试通过列表索引访问度数,则索引可能不对应正确的节点。如果你希望它们对应,可以改为使用以下方法:
degrees = [val for (node, val) in sorted(G.degree(), key=lambda pair: pair[0])]

下面是一个简单的例子来说明这个问题:

>>> edges = [(0, 1), (0, 3), (0, 5), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (2, 5)]
>>> g = nx.Graph()
>>> g.add_edges_from(edges)
>>> print(g.degree())
[(0, 3), (1, 4), (3, 3), (5, 2), (2, 4), (4, 2)]
>>> print([val for (node, val) in g.degree()])
[3, 4, 3, 2, 4, 2]
>>> print([val for (node, val) in sorted(g.degree(), key=lambda pair: pair[0])])
[3, 4, 4, 3, 2, 2]

2

您也可以使用字典推导式来获取实际的字典:

degrees = {node:val for (node, val) in G.degree()}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接