2013-03-27 16 views
2

我想循环遍历一个三维数组。有没有其他方法比以下更有效率(或更快)?Python的替代三重奏

for i, j, k in itertools.product(*map(xrange, (len(x), len(y), len(z)))) 

在这个例子中,x,y和z是三个一维数组。

我的源代码是这样的,我不希望列表的价值。

for i, j, k in itertools.product(*map(xrange, (len(x0), len(y0), len(z0)))): 
     print "p[%d][%d][%d] = %d" % (x0[i], y0[j], z0[k], p[i][j][k]) 

p是三维阵列

+0

我解释邪恶,编辑我的帖子,对不起 – kshipuden 2013-03-27 11:00:42

+0

你确实使用了列表的值:'x0 [i],y0 [j],z0 [k]'检索那些值。 – 2013-03-27 11:04:46

+1

任何时候你发现自己将'range'(或2.x中的'xrange')和'len',* stop *并且想想你在做什么。 [另见](http://stackoverflow.com/a/4383321/523612)。 – 2013-03-27 12:12:55

回答

0

你不需要在x,y,&ž名单,所以通过数组循环,有和没有指数的下列方式,都更有效的在某种意义上说,他们不使用他们:

import itertools 
from pprint import pprint 

W,H,D = 3,4,5 
p = [[[k*W*H + j*W+i for i in xrange(3)] for j in xrange(4)] for k in xrange(5)] 
assert (W,H,D) == (len(p[0][0]),len(p[0]),len(p)) 
pprint(p) 

print 
for i, j, k in itertools.product(xrange(D), xrange(H), xrange(W)): 
    print "p[%d][%d][%d] = %d" % (i, j, k, p[i][j][k]) 
print 
for i in xrange(D): 
    for j in xrange(H): 
     for k in xrange(W): 
      print "p[%d][%d][%d] = %d" % (i, j, k, p[i][j][k]) 
print 
for col in p: 
    for row in col: 
     for elem in row: 
      print elem 
print 
for i, col in enumerate(p): 
    for j, row in enumerate(col): 
     for k, elem in enumerate(row): 
      print "p[%d][%d][%d] = %d" % (i, j, k, elem) 
6

为什么不直接在列表自己而不是循环?

for i, j, k in itertools.product(x, y, z): 

你不必指数现在,你有实际值:

>>> x, y, z = range(3), range(3, 6), range(6, 9) 
>>> for i, j, k in itertools.product(x, y, z): 
...  print i, j, k 
... 
0 3 6 
0 3 7 
0 3 8 
0 4 6 
# .. ~ .. 
2 4 8 
2 5 6 
2 5 7 
2 5 8 

如果有指数也只是用enumerate()

>>> for (ii, i), (jj, j), (kk, k) in itertools.product(*map(enumerate, (x, y, z))): 
...  print (ii, i), (jj, j), (kk, k) 
... 
(0, 0) (0, 3) (0, 6) 
(0, 0) (0, 3) (1, 7) 
(0, 0) (0, 3) (2, 8) 
(0, 0) (1, 4) (0, 6) 
# .. ~ .. 
(2, 2) (1, 4) (2, 8) 
(2, 2) (2, 5) (0, 6) 
(2, 2) (2, 5) (1, 7) 
(2, 2) (2, 5) (2, 8) 
2

你也可以做到这一点

for i in x: 
    for j in y: 
    for k in z: 
     print i,j,k