Ну, преемник наследника - это просто наследник потомков, верно?
# First successors
descend = G.successors(parent1)
# 2nd level successors
def allDescendants(d1):
d2 = []
for d in d1:
d2 += G.successors(d)
return d2
descend2 = allDescendants(descend)
Чтобы получить потомков 3-го уровня, вызовите allDescendants (d2) и т. Д.
Edit:
Выпуск 1:
allDescend = descend + descend2
дает вам два набора вместе, сделайте то же самое для дальнейших уровней потомков.
Issue2: Если у вас есть циклы на графике, вам нужно сначала изменить код, чтобы проверить, посещали ли вы этого потомка раньше, например:
def allDescendants(d1, exclude):
d2 = []
for d in d1:
d2 += filter(lambda s: s not in exclude, G.successors(d))
return d2
Таким образом, вы передаете allDescend
в качестве второго аргумента вышеупомянутой функции, чтобы он не был включен в будущие потомки. Вы продолжаете делать это до тех пор, пока allDescandants()
не вернет пустой массив, и в этом случае вы узнаете, что изучили весь граф, и не остановитесь.
Поскольку это начинает выглядеть как домашнее задание, я дам вам понять, как собрать все это вместе. ;)