Список преемников в DiGraph в Networkx

Я работаю над функцией, которая создает семейное дерево с использованием ориентированного графа в networkx, где узлы являются членами семьи с датой рождения в качестве атрибута узла. Теперь я хочу создать другую функцию, которая с учетом графа G и имени узла возвращает отсортированный список всех «внуков» этого узла. В общем, я делаю так:

return sort(G.successors(G.successors(node)))

Но поскольку G.successors возвращает список преемников, это не работает.

Как бы вы к этому подойти?

Спасибо!


person Tacoman    schedule 22.04.2020    source источник
comment
Существует метод networkx с именем nx.descendants(g, source), который возвращает все узлы, доступные из (источника) в G.   -  person Scott Boston    schedule 23.04.2020


Ответы (1)


Вы можете написать свою собственную функцию для этой задачи. Если вы уверены, что ваш DiGraph является деревом, вы можете заменить set() на list. Пожалуйста, также добавьте минимальный воспроизводимый пример с желаемым результатом в свои следующие вопросы.

import networkx as nx

family_tree = nx.DiGraph()

family_tree.add_edges_from([("GP", "P1"), ("GP", "P2"), ("P1", "S1"), ("S1", "GS1"), ("P1", "S2")])

def successors_of_successors(graph, node):
    results = set()
    for successor in graph.successors(node):
        results.update(graph.successors(successor))

    return results

print(successors_of_successors(family_tree, "GP"))
# {'S2', 'S1'}
print(successors_of_successors(family_tree, "P1"))
# {'GS1'}
person Sparky05    schedule 23.04.2020
comment
Спасибо, вы можете просто принять ответ;) Это экономит место для комментариев, см. stackoverflow.com/help/someone-answers - person Sparky05; 25.04.2020