2012-02-27 3 views
8

В мультиграфе каждый вызов * add_edge (а, б, вес = 1) * добавит новое ребро между узлами и б. При построении графика можно ли изменить этот вес, когда a и b найдены снова. Прямо сейчас я делаю чек, чтобы выяснить, связаны ли (a, b) или (b, a), затем удалить кромку и добавить новый. Мне кажется, что я просто могу обновить вес.Изменение края атрибутов в NetworkX мультиграфе

Примечание: мне нужно мультиграфы потому что я использую различные типы ребер между узлами (дифференцированным использованием ключа)

ответ

13

Multigraph.add_edge документация указывает на то, что вы должны использовать key аргумент, чтобы однозначно идентифицировать края в мультиграфе. Вот пример:

>>> import networkx as nx 
>>> G = nx.MultiGraph() 
>>> G.add_edge(1, 2, key='xyz', weight=2) 
>>> G.add_edge(1, 2, key='abc', weight=1) 
>>> G.edges(data=True) 
[(1, 2, {'weight': 2}), (1, 2, {'weight': 1})] 

Теперь, чтобы обновить край заклиненного по xyz, просто передать этот параметр снова:

>>> G.add_edge(1, 2, key='xyz', weight=7) 
>>> G.edges(data=True) 
[(1, 2, {'weight': 7}), (1, 2, {'weight': 1})] 

Чтобы прочитать предыдущее значение, вы можете использовать get_edge_data так:

>>> G.get_edge_data(1, 2, key='xyz') 
{'weight': 7} 
+0

Спасибо! как получить ребра, соответствующие ключу? например, знать предыдущее значение _weight_. Нужно ли мне перебирать все края, чтобы сначала проверить ключ? – Vladtn

+1

@ Vladtn обновленный ответ, чтобы включить, как это сделать – jterrace

+1

Это значительно упрощает мой код ... – Vladtn

Смежные вопросы