2010-09-11 2 views
1

У меня есть карта, назовем ее M, которая содержит данные, отображаемые через N измерений.Итерация по N измерениям в Python

# If it was a 2d map, I could iterate it thusly: 
start, size = (10, 10), (3, 3) 
for x in range(start[0], start[0]+size[0]): 
    for y in range(start[1], start[1]+size[1]): 
     M.get((x, y)) 
# A 3d map would add a for z in ... and access it thusly 
M.get((x, y, z)) 
# And so on. 

Мой вопрос: Как создать итератор, который может привести к правильной последовательности итераций? То есть, учитывая start, size = (10, 10), (3, 3), он даст последовательность 2-кортежей (10, 10), (10, 11), (10, 12), (11, 10), (11, 11) и т. Д. При заданном start, size = (10, 10, 10), (3, 3, 3) это даст правильную последовательность из 3 кортежей.

Да, я пробовал себя, но голова взорвалась. Или я не могу оправдать трату времени, выясняя это, хотя это весело. Выбирай :)

ответ

8

В Python 2.6+:

itertools.product(*[xrange(i, i+j) for i,j in zip(start, size)]) 
0

С делать это ваш генератор самостоятельно expreessions:

start, size = (10, 10), (3, 3) 
values2=((x+xd,y+yd) 
     for x,y in (start,) 
     for xr,yr in (size,) 
     for xd in range(xr) 
     for yd in range(yr)) 

for x,y in values2: 
    print x,y 

start, size = (10, 10, 10), (3, 3, 3) 
values3=((x+xd,y+yd, z+zd) 
     for x,y,z in (start,) 
     for xr,yr,zr in (size,) 
     for xd in range(xr) 
     for yd in range(yr) 
     for zd in range(zr)) 

for x,y,z in values3: 
    print x,y,z 
Смежные вопросы