Pythonic ярлык для двойного вложенного цикла? - PullRequest
14 голосов
/ 28 марта 2011

Подумайте, есть ли у меня функция, которая принимает аргумент кортежа (x, y), где x находится в диапазоне (X), а y в диапазоне (Y), нормальный способ сделать это будет:

for x in range(X):
    for y in range(Y):
        function(x,y)

есть ли способ сделать

for xy in something_like_range(X,Y):
    function(xy)

такой, что xy был кортежем (x, y)?

Ответы [ 5 ]

16 голосов
/ 28 марта 2011

Вы можете использовать продукт от itertools

>>> from itertools import product
>>> 
>>> for x,y in product(range(3), range(4)):
...   print (x,y)
... 
(0, 0)
(0, 1)
(0, 2)
(0, 3)
(1, 0)
(1, 1)
(1, 2)
(1, 3)

... and so on

Ваш код будет выглядеть так:

for x,y in product(range(X), range(Y)):
    function(x,y)
5 голосов
/ 28 марта 2011

Вы можете использовать itertools.product():

from itertools import product
for xy in product(range(X), range(Y)):
    function(xy)
4 голосов
/ 28 марта 2011

Pythonic они -> ( изменить в соответствии с вашими требованиями )

>>> [ (x,y)   for x in range(2)   for y in range(2)]
[(0, 0), (0, 1), (1, 0), (1, 1)]

Версия генератора :

gen = ( (x,y)   for x in range(2)   for y in range(2) )
>>> for x,y in gen:
...     print x,y
... 
0 0
0 1
1 0
1 1
2 голосов
/ 28 марта 2011

Попробуйте продукт из itertools: http://docs.python.org/library/itertools.html#itertools.product

from itertools import product

for x, y in product(range(X), range(Y)):
    function(x, y)
0 голосов
/ 18 января 2012
from itertools import product

def something_like_range(*sizes):
    return product(*[range(size) for size in sizes])

для использования, близкого к тому, что вы хотели:

for x,y in something_like_range(X,Y):
    your_function(x,y)

=)

...