2017-01-14 7 views
0

У меня есть краевой список, он состоит из двух столбцов, я хочу создать взвешенный ориентированный граф таким образом, что для каждой строки в краевом списке направленный край с вес один идет от узла в столбце один к узлу в столбце два. если одна и та же строка появляется более одного раза в краевом списке, она должна увеличивать вес на один за каждый раз, когда он появляется.Как создать взвешенный ориентированный граф из списка ребер в Networkx

Я использую библиотеку Python Networkx, как я могу это сделать?

ответ

4

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

import networkx as nx 
from collections import Counter 

EDGES = [ 
    ('A', 'B'), 
    ('B', 'C'), 
    ('A', 'C'), 
    ('C', 'D'), 
    ('A', 'B') 
] 

g = nx.DiGraph((x, y, {'weight': v}) for (x, y), v in Counter(EDGES).items()) 
print(*g.edges(data=True), sep='\n') 

Выход:

('A', 'B', {'weight': 2}) 
('A', 'C', {'weight': 1}) 
('C', 'D', {'weight': 1}) 
('B', 'C', {'weight': 1}) 

В выше Counter возвращает (edge, count) кортежей. Обратите внимание, что ребра, прошедшие до Counter, должны быть хешируемыми.

>>> edges = list(Counter(EDGES).items()) 
>>> edges 
[(('A', 'B'), 2), (('B', 'C'), 1), (('C', 'D'), 1), (('A', 'C'), 1)] 

Тогда выражение используется генератор, чтобы получить края в формате, который ожидает, что DiGraph:

>>> params = list((x, y, {'weight':v}) for (x,y), v in edges) 
>>> params 
[('A', 'B', {'weight': 2}), ('B', 'C', {'weight': 1}), ('C', 'D', {'weight': 1}), ('A', 'C', {'weight': 1})]