2010-09-11 166 views
1

我有一張地圖,我們稱之爲M,其中包含通過N維映射的數據。在Python中迭代N維

# 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