Pythonic ярлык для двойного вложенного цикла?
Рассмотрим, если бы у меня была функция, которая принимала аргумент кортежа (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)?
Ответы
Ответ 1
Вы можете использовать продукт из 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)
Ответ 2
Вы можете использовать itertools.product()
:
from itertools import product
for xy in product(range(X), range(Y)):
function(xy)
Ответ 3
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
Ответ 4
Попробуйте продукт из 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)
Ответ 5
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)
=)