Добавление весов к краям MultiDiGraph

У меня есть мультидиграф, в котором края не имеют веса. Я хотел бы добавить некоторые веса

G=MultiDiGraph():

......

  for u, v, data in G.edges_iter(data=True):
     G.edge[u][v]['weight'] = None

И я получаю следующее для краев:

('08B', '09B', {}),
('08B', '09B', {}),
('08B', '09B', {}),
('08B', '09B', 1),
('03P', '05T', {}),
('03P', '05T', 1)]

То есть он добавляет веса только в одном случае. Как я могу добавить вес всем краям?

1 ответ

Проблема, с которой вы столкнулись, заключается в том, что вы получаете доступ к атрибутам ребер, используя дополнительный словарь в мультиграфах. В частности, каждое ребро имеет словарь копий, поэтому вы получаете доступ к атрибутам для данного ребра следующим образом:

G.edge[u][v][replicate][attr] = val

Так что, если вы хотите обновить атрибуты для всех между парой (u, v) узлов, вы можете определить функцию следующим образом:

def set_multi_edge_attr(u, v, attr, val):
    for repl in G.edge[u][v].keys():
       G.edge[u][v][repl][attr] = val

где repl представляет копию отдельного ребра. Вот простой пример:

>>> import networkx as nx
>>> G = nx.MultiDiGraph()
>>> G.add_edges_from([(0, 1), (0, 1), (0, 1)])
>>> G.edges(data=True)
[(0, 1, {}), (0, 1, {}), (0, 1, {})]
>>> set_multi_edge_attr(0, 1, 'weight', 1)
>>> G.edges(data=True)
[(0, 1, {'weight': 1}), (0, 1, {'weight': 1}), (0, 1, {'weight': 1})]
Другие вопросы по тегам