Лучший источник информации - официальный учебник Python по составлению списков . Понимание списков почти такое же, как и циклы for (конечно, любое понимание списка может быть записано в виде цикла for), но они часто быстрее, чем использование цикла for.
Взгляните на этот более длинный список из учебника ( if
часть фильтрует понимание, только части, которые передают оператор 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)]
Он точно такой же, как и этот вложенный цикл for (и, как сказано в руководстве, обратите внимание, что порядок for и if одинаков).
>>> 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 (где вы что-то делаете) идет в начале, а не в конце.
На ваши вопросы:
Какого типа должен быть объект, чтобы использовать эту структуру цикла?
Итерацию . Любой объект, который может генерировать (конечный) набор элементов. К ним относятся любой контейнер, списки, наборы, генераторы и т. Д.
В каком порядке i и j присваиваются элементам в объекте?
Они назначаются в том же порядке, в котором они генерируются из каждого списка, как если бы они были во вложенном цикле for (для вашего первого понимания вы получите 1 элемент для i, затем каждое значение из j, 2-й элемент в i, затем каждое значение из j и т. д.)
Можно ли смоделировать это с помощью другой структуры цикла for?
Да, уже показано выше.
Можно ли вложить этот цикл for в аналогичную или другую структуру цикла for? А как бы это выглядело?
Конечно, но это не лучшая идея. Вот, например, список списков персонажей:
[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]
Возможно, вас заинтересует
itertools.product
, который возвращает итерируемый, дающий кортеж значений из всех итераций, которые вы ему передаете. То естьitertools.product(A, B)
выдает все значения формы(a, b)
, откудаa
берутся значенияA
и откуда берутсяb
значенияB
. Например:Это печатает:
Обратите внимание, как последний аргумент, переданный
itertools.product
в "внутренний". Как правило, равноitertools.product(a0, a1, ... an)
[(i0, i1, ... in) for in in an for in-1 in an-1 ... for i0 in a0]
источник
Прежде всего, ваш первый код использует не цикл for как таковой, а понимание списка .
Было бы эквивалентно
для j в диапазоне (0, ширина): для i в диапазоне (0, высота): m [i] [j]
Примерно так же, как и для циклов, справа налево. Но синтаксис понимания списка более сложен.
Я не уверен, что задает этот вопрос
Любой итерируемый объект, который дает итерируемые объекты, которые дают ровно два объекта (что за глоток - т.е.
[(1,2),'ab']
был бы действительным)Порядок, в котором объект уступает место при итерации.
i
идет к первому урожаю,j
второму.Да, но не так красиво. Я считаю, что это функционально эквивалентно:
или даже лучше использовать карту :
Но, конечно , функция бы получить
i
,j
сам.Разве это не тот же вопрос, что и 3?
источник
Вы можете использовать два цикла for в одной строке с помощью
zip
функцииКод:
Вывод:
['Abbas', 'Kamran', 'Ali', 'Asgar', 'Usman', 'Hamza']
Итак, с помощью функции zip мы можем использовать два цикла for или перебирать два списка в одной строке.
источник
Ниже приведен код лучших примеров для вложенных циклов. При использовании двух циклов for помните, что выходные данные первого цикла являются входными данными для второго цикла. Завершение цикла также важно при использовании вложенных циклов
источник