Вложенный цикл for
в понимании работает слева направо, поэтому самый правый цикл - это внутренний цикл, левый цикл - внешний .Например -
a = [1,2,3]
b = [8,9,0]
[(a1, b1) for a1 in a for b1 in b]
Эквивалентно:
l = []
for a1 in a:
for b1 in b:
l.append((a1, b1))
l
Оба выдают следующее при запуске
[(1, 8), (1, 9), (1, 0), (2, 8), (2, 9), (2, 0), (3, 8), (3, 9), (3, 0)]
Для вашего примера кода -
paths = [[end]]
while paths and paths[0][0] != start:
paths = [[parent] + path for path in paths for parent in childToParents[path[0]]]
Будет эквивалентно:
paths = [[end]]
while paths and paths[0][0] != start:
paths_, paths = paths, []
for path in paths_:
for parent in childToParents[path[0]]:
paths.append([parent] + path)
paths
Обратите внимание на paths_, paths = paths, []
, необходимый для сохранения содержимого paths
для повторения, все еще сбрасывая его для последующего цикла.Запуск вышеуказанного с вашими входами дает мне:
[['hit', 'hot', 'dot', 'dog', 'cog'], ['hit', 'hot', 'lot', 'log', 'cog']]