Создайте взвешенный NetworkX DiGraph из дескрипта python dict of dicts - PullRequest
0 голосов
/ 11 октября 2018

У меня есть словарь Python, подобный этому: {0: {1: 10, 2: 1}, 1: {2: 1}, 2:{3: 1}, 3: {1: 1}}

Где каждый ключ верхнего словаря является узлом происхождения, каждый ключ словаря значений является доступным узлом из него, а его значение являетсяСтоимость туда.Например, вы можете перейти от 0 до 1 со стоимостью 10.

Теперь я хочу построить из него NetworkX DiGraph.Читая документацию NetworkX Я понял, что могу использовать nx.DiGraph(incoming_graph_data=my_dict_of_dicts) для создания DiGraph, но я теряю затраты между узлами при его создании.

Кто-нибудь знает, что происходит?

Большое вам спасибо.

1 Ответ

0 голосов
/ 11 октября 2018

Вам нужно изменить свои внутренние словари, например, конвертировать {1: 10, 2: 1} в {1: {'weight': 10}, 2: {'weight': 1}}.См. this , вот некоторый код:

import networkx as nx

my_dict_of_dicts = {0: {1: 10, 2: 1}, 1: {2: 1}, 2: {3: 1}, 3: {1: 1}}

for k, d in my_dict_of_dicts.items():
    for ik in d:
        d[ik] = {'weight': d[ik]}

g = nx.DiGraph(my_dict_of_dicts)

for s, t, w in g.edges(data=True):
    print(s, t, w)

Выход

0 1 {'weight': 10}
0 2 {'weight': 1}
1 2 {'weight': 1}
2 3 {'weight': 1}
3 1 {'weight': 1}

Или в качестве альтернативы вы можете использовать выражение генератора:

import networkx as nx

my_dict_of_dicts = {0: {1: 10, 2: 1}, 1: {2: 1}, 2: {3: 1}, 3: {1: 1}}
g = nx.DiGraph((k, v, {'weight': weight}) for k, vs in my_dict_of_dicts.items() for v, weight in vs.items())

for s, t, w in g.edges(data=True):
    print(s, t, w)

Вывод

0 1 {'weight': 10}
0 2 {'weight': 1}
1 2 {'weight': 1}
2 3 {'weight': 1}
3 1 {'weight': 1}

ОБНОВЛЕНИЕ

Как уже упоминалось @eduhs, вам нужно добавить несвязанные вершины,для этого вы можете добавить эту строку после создания графика:

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