Создание узлов из ключей и ребер из значений из словаря Networkx - PullRequest
0 голосов
/ 23 апреля 2020

Я застрял, пытаясь решить проблему, с которой сталкиваюсь. Как упоминалось в этом post , функция nx.Graph() может принимать словарь в качестве аргумента инициализации. Что отлично работает, но я имел в виду что-то другое.

Мой словарь выглядит следующим образом (содержание упрощено):

graph = {'A': ['a','b','c'], 'B':['a','b','c']}

Это создает следующее: сюжет

Как видно из 'B Узлы ',' A ',' a ',' b 'и' c 'созданы. То, что я ищу, - это способ инициализировать ключи в моем словаре как узлы, а значения - как ребра. Это приведет к созданию сети из двух узлов с тремя ребрами, так как оба «A» и «B» содержат «a», «b» и «c».

Возможно, решение достаточно простое, но после уставившись на документацию, надеюсь, у кого-то есть ответ, всякая помощь приветствуется.

1 Ответ

0 голосов
/ 23 апреля 2020

Похоже, что вам нужен Мультиграф , учитывая, что вы хотите иметь узлы с несколькими ребрами. В этом случае, следуя описанной вами логике c, вы хотите проверить все пары узлов (keys), какие значения распределены между ними, и использовать их в качестве ребер, соединяющих эти узлы. Для этого мы можем найти длины 2 комбинаций всех ключей и найти set.intersection их значений для установки путей:

from itertools import combinations
graph = {'A': ['a','b','c'], 'B':['a','b','c']}

G = nx.MultiGraph()
for nodes in combinations(graph.keys(), r=2):
    common_edges = set(graph[nodes[0]]) & set(graph[nodes[1]])
    for edge in common_edges:
        G.add_edge(*nodes, value=edge)

Если вы хотите визуализировать график, вы может использовать Graphviz, который отображает параллельные края. Вы можете написать график в формате dot и сохранить его как png с помощью:

nx_pydot.write_dot(G, 'multig.dot')
!dot -T png multig.dot > multig.png

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...