2013-03-27 4 views
2

Je souhaite parcourir un tableau tridimensionnel. Existe-t-il une méthode alternative plus efficace (ou plus rapide) que la suivante?Triple alternatif pour Python

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

Dans cet exemple, x, y et z sont trois tableaux unidimensionnels.

Mon code source est ceci, je ne veux pas la valeur des listes.

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 étant le 3D-tableau

+0

J'explique mal, éditer mon post, désolé – kshipuden

+0

Vous utilisez les valeurs de la liste: 'x0 [i], y0 [j], z0 [k]' récupère ces valeurs. –

+1

Chaque fois que vous vous trouvez en combinant 'range' (ou' xrange' dans 2.x) et 'len', * stop * et pensez à ce que vous faites. [Voir aussi] (http://stackoverflow.com/a/4383321/523612). –

Répondre

0

Vous n'avez pas besoin x, y, z & listes, de sorte que les façons suivantes de boucler à travers le réseau, avec et sans indices, sont tous plus efficaces dans le sens où ils ne les utilisent pas:

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

Pourquoi ne pas en boucle un peu plus les listes se à la place?

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

que vous faites, vous n'avez pas ont des indices maintenant les valeurs réelles:

>>> 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 

Si vous ont d'avoir les indices aussi, il suffit d'utiliser 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

Vous peut également le faire

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