Python Networkx边缘属性

Python Networkx边缘属性,python,networkx,Python,Networkx,我有一个像这样的有向图- G = nx.DiGraph() G.add_edge('a', 'b', attr=0.6) G.add_edge('a', 'c', attr=0.2) G.add_edge('d', 'a', attr=0.3) 如何通过节点“a”获取以下格式的属性 [0.6, 0.2, -0.3] 下面是通过迭代图的edges.data()得到的一个解决方案。附言:我基本上使用JuPyter中的制表符补全来查找属性,然后通过使用不同的属性提出了以下解决方案。此代码只会按照您

我有一个像这样的有向图-

G = nx.DiGraph()
G.add_edge('a', 'b', attr=0.6)
G.add_edge('a', 'c', attr=0.2)
G.add_edge('d', 'a', attr=0.3)
如何通过节点“a”获取以下格式的属性

[0.6, 0.2, -0.3]

下面是通过迭代图的
edges.data()
得到的一个解决方案。附言:我基本上使用JuPyter中的制表符补全来查找属性,然后通过使用不同的属性提出了以下解决方案。此代码只会按照您的要求提供
'a'
的属性。因此,如果您将第四个节点添加为
G.add_edge('d','b',attr=0.7)
,则输出将是
[0.6,0.2,-0.3]
,其中第四个节点不计算在内

attributes = []

for edge in G.edges.data():
    if edge[0] == 'a':
        attributes.append(edge[-1]['attr'])
    elif edge[1] == 'a'   :
        attributes.append(-edge[-1]['attr'])

print (attributes)    
# [0.6, 0.2, -0.3]

这应该可以做到,尽管可能有更好的方法:

In [3]: [G[e[0]][e[1]]['attr'] for e in  G.out_edges('a')] + [-G[e[0]][e[1]]['attr'] for e in  G.in_edges('a')]

Out[3]: [0.6, 0.2, -0.3]

上面的代码使用两个列表理解来循环通过
a
中的所有出站和入站边缘,并从边缘中拾取属性,如果属性来自入站边缘,则指定负值

当我们有大型图时,迭代所有边的代价会很高。 我建议您查找特定节点的后续节点和前置节点,然后获取有关相应边的信息

[G.get_edge_data('a',neigh)['attr'] for neigh in G.successors('a')] + \
[-G.get_edge_data(neigh,'a')['attr'] for neigh in G.predecessors('a')]