Лучшим источником информации является official Python tutorial on list comprehensions. Сопоставления списков почти такие же, как для циклов (конечно, любое понимание списка может быть записано как цикл for), но они часто бывают быстрее, чем использование цикла for.
Посмотрите на этом длинный список осмысление из учебника (if
части фильтрует понимание, только части, которые проходят, если заявление передается в заключительную часть списка понимания (здесь (x,y)
):
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
это точно так же, как это вложенный цикл (и, как говорит учебник, обратите внимание, что порядок для и если одни и те же).
>>> combs = []
>>> for x in [1,2,3]:
... for y in [3,1,4]:
... if x != y:
... combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
основная разница между пониманием списка и циклом for заключается в том, что конечная часть цикла for (где вы что-то делаете) происходит в начале, а не в конце.
На ваши вопросы:
Какие должны быть объект для того, чтобы использовать это для структуры петли?
iterable. Любой объект, который может генерировать (конечный) набор элементов. К ним относятся любой контейнер, списки, наборы, генераторы и т. Д.
Каков порядок, в котором i и j назначены элементам в объекте?
Они назначаются точно в том же порядке, в каком они созданы из каждого списка, как если бы они находились во вложенном цикле (для вашего первого понимания вы получите 1 элемент для i, тогда каждое значение из j , 2-й элемент в i, затем каждое значение из j и т. Д.)
Можно ли его моделировать другой структурой петли?
Да, уже показано выше.
Может ли это для цикла быть вложенным с аналогичной или другой структурой для цикла? И как это будет выглядеть?
Конечно, но это не отличная идея. Вот, к примеру, дает вам список списков символов:
[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]
Интересно, что руководствовался их выбором заказа в двойном гнездовании. Я нахожу другой путь более естественным (для y, затем для x в вашем примере). Я просто понимаю, что после 3 лет работы с python (не сильно, но все же ...) и использования этих типов циклов! – Thomas
хорошо сказанный, спасибо! –