Как перевести pythonic double for loop в стандартный код? - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть этот кусок кода Python, который мне трудно понять:

paths = [[end]]
while paths and paths[0][0] != start:
    paths = [[parent] + path for path in paths for parent in childToParents[path[0]]]

, где childToParents:

defaultdict(<class 'set'>, {'cog': {'log', 'dog'},
                            'dog': {'dot'},
                            'dot': {'hot'},
                            'hit': None,
                            'hot': {'hit'},
                            'log': {'lot'},
                            'lot': {'hot'}})

end, "cog"начало - "hit".Ожидаемый вывод путей:

[["hit","hot","lot","log","cog"],["hit","hot","dot","dog","cog"]]

Я пробовал несколько вариантов двойной петли for.Одна из таких попыток:

    paths=[[end]]
    while paths and paths[0][0] != start:
        for i in xrange(len(paths)):
            for parent in childToParents[paths[i][0]]:
                paths[i] = [parent] + paths[i]

Но это только дает мне:

[["hit","hot","dot","dog","log","cog"]]

Как я могу перевести код в стандартный двойной цикл for?

1 Ответ

0 голосов
/ 25 сентября 2018

Вложенный цикл 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']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...