Поскольку вы помечено networkx
, вот решение с помощью этой библиотеки.
В приведенном ниже коде я создаю диаграмму направленности, а затем добавляю ребра из вашего списка. Важно: первым узлом в ребрах будет исходный узел, а второй узел будет целевым узлом, то есть дети укажут на своих родителей.
Чтобы получить родителей ребенка, я использую out_edges
, а для получения детей от родителей я использую in_edges
. Обратите внимание, что обе функции возвращают список ребер.
import networkx as nx
edges = [('Child1', 'Parent1'), ('Child2', 'Parent2'), ('Child3', 'Parent1'),
('Child4', 'Parent3'), ('Child2', 'Parent1')]
G = nx.DiGraph()
G.add_edges_from(edges)
print(G.out_edges('Child2')) # parents of Child2
print(G.in_edges('Parent1')) # children of Parent1
Выход:
[('Child2', 'Parent2'), ('Child2', 'Parent1')]
[('Child2', 'Parent1'), ('Child1', 'Parent1'), ('Child3', 'Parent1')]
Вы можете использовать список понимание, чтобы получить списки с отдельными детьми или родителями.
temp = [edge[1] for edge in G.out_edges('Child2')]
print('Parents of Child2:', temp)
temp = [edge[0] for edge in G.in_edges('Parent1')]
print('Children of Parent1:', temp)
Выход:
Parents of Child2: ['Parent2', 'Parent1']
Children of Parent1: ['Child2', 'Child1', 'Child3']
Что вы имеете в виду * * анализировать? Какие запросы/запросы вы хотите решить? Топологическая сортировка? кратчайший путь? Эйлеровский цикл? –
Я хотел бы понять направления между узлами. Например. узел A является дочерним узлом B и C, а родительский элемент этих узлов D, E, F. – Greg