Есть ли в Python краткий способ использования понимания списка с несколькими итераторами?

По сути, я хотел бы построить понимание списка по «декартовому произведению» двух итераторов. Подумайте о следующем коде Haskell:

[(i,j) | i <- [1,2], j <- [1..4]]

который дает

[(1,1),(1,2),(1,3),(1,4),(2,1),(2,2),(2,3),(2,4)]

Могу ли я получить аналогичное поведение в Python в краткой форме?


person Federico A. Ramponi    schedule 01.12.2008    source источник


Ответы (4)


Вы спрашиваете об этом?

[ (i,j) for i in range(1,3) for j in range(1,5) ]
person S.Lott    schedule 01.12.2008

Декартово произведение находится в модуле itertools (в версии 2.6).

>>> import itertools
>>> list(itertools.product(range(1, 3), range(1, 5)))
[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4)]
person A. Coady    schedule 01.12.2008

Забавный факт о вложенном понимании: оно имитирует вложенные циклы for, поэтому внутренние циклы могут использовать значения из внешних. Это бесполезно в случае с декартовым произведением, но полезно знать. Например:

[ (i,j) for i in range(10) for j in range(i) ] 

генерирует все пары (i,j), где 0>=i>j>10.

person Rafał Dowgird    schedule 01.12.2008

Кажется, это делает то, что вы описываете:

[[a,b] для a в диапазоне (1,3) для b в диапазоне (1,5)]

ОБНОВЛЕНИЕ: Черт! Нужно было перезагрузить страницу, чтобы увидеть ответ С.Лотта перед публикацией. Хм... что делать, чтобы добавить немного ценности? Возможно, краткое свидетельство полезности интерактивного режима с Python.

Совсем недавно я пришел из фона с Perl, поэтому с такими проблемами я считаю очень полезным ввести «python» в командной строке и перейти в интерактивный режим и просто а) начать пробовать что-то и б) уточнить тонкости, нажав -стрелка и корректирую свою предыдущую попытку, пока не получу то, что хочу. Каждый раз, когда я не понимаю какое-то ключевое слово, помощь всегда рядом. Просто введите: help("some_keyword"), прочитайте краткое описание, затем нажмите «Q», и я снова в сети для прямого разговора с интерпретатором Python.

Рекомендуется, если вы новичок и не используете его.

person dvergin    schedule 01.12.2008