python: однолинейное декартово произведение для цикла - PullRequest
4 голосов
/ 23 апреля 2011

Знаете ли вы, что вы можете сделать это?

>>> [(x,y) for x in xrange(2) for y in xrange(5)]
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4)]

Это аккуратно.Есть ли версия для цикла или можно сделать это только для списочных представлений?

РЕДАКТИРОВАТЬ: Я думаю, что мой вопрос был неправильно понят.Я хочу знать, есть ли специальный синтаксис для этого:

for x in xrange(2) <AND> y in xrange(5):
    print "do stuff here"
    print "which doesn't fit into a list comprehension"
    print "like printing x and y cause print is a statement", x, y

Я мог бы сделать это, но кажется немного повторяющимся:

for x,y in ((x,y) for x in xrange(2) for y in xrange(5)):
    print x, y

Ответы [ 2 ]

7 голосов
/ 23 апреля 2011

Ну, нет синтаксиса для того, что вы хотите, но есть itertools.product.

>>> import itertools
>>> for x, y in itertools.product([1,2,3,4], [5,6,7,8]): print x, y
... 
1 5
1 6
1 7
1 8
[ ... and so on ... ]
5 голосов
/ 23 апреля 2011

Это эквивалентная, более компактная версия:

def values():
    for x in xrange(2):
        for y in xrange(5):
            yield (x, y)
list(values())

Обновление : Чтобы сравнить оба байт-кода, сделайте следующее:

import dis
print dis.dis(values)   # above function

gen = ((x,y) for x in xrange(2) for y in xrange(5))
print dis.dis(gen.gi_code)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...