добавление редактирования networkx со словарем

#python #networkx #edges

Вопрос:

У меня есть структура данных следующим образом:

 {1: [2, 3, 4, 5, 6, 7, 8, 10, 12], 8: [9], 14: [15, 17, 19, 20]}
 

ключом словаря является родительский элемент, а следующий список-дочерние элементы.
Я хотел бы добавить края в DAG Networkx.

Я знаю, что могу создать список кортежей:

 edges=[]
for parent,children in dic.items():
    for child in children:
        edges.append((parent,child))

[(2,1)(3,1)(4,1)  ...etc]
 

а затем добавьте кортежи в виде:

 G.add_edges_from([(2,1)(3,1)(4,1) ....])
 

Есть ли какой-либо способ более непосредственного добавления ребер без необходимости реструктуризации структуры данных, которая у меня изначально есть?

Спасибо

ИЗМЕНИТЬ: Понимание этого списка не работает должным образом:

 [(parent,child) for child in children for parent,children in dic.items()]
 

Ответ №1:

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

 import networkx as nx

d = {1: [2, 3, 4, 5, 6, 7, 8, 10, 12], 8: [9], 14: [15, 17, 19, 20]}
G = nx.Graph(d)
edges = list(G.edges)
print(edges)
 

Выход

 [(1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 10), (1, 12), (8, 9), (14, 15), (14, 17), (14, 19), (14, 20)]
 

Альтернативное использование convert.from_dict_of_lists

 import networkx as nx

d = {1: [2, 3, 4, 5, 6, 7, 8, 10, 12], 8: [9], 14: [15, 17, 19, 20]}
G = nx.convert.from_dict_of_lists(d)
edges = list(G.edges)
print(edges)
 

Выход

 [(1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 10), (1, 12), (8, 9), (14, 15), (14, 17), (14, 19), (14, 20)]