2009-06-09 31 views

Respuesta

38

Está claro que estás usando numpy. Con numpy sólo se puede hacer:

for cell in self.cells.flat: 
    do_somethin(cell) 
+1

Creo que ahora hay una manera más efectiva de hacer esto con ['numpy.nditer()'] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.nditer.html) – tuned

13

Simplemente itere sobre una dimensión, luego la otra.

for row in self.cells: 
    for cell in row: 
     do_something(cell) 

Por supuesto, con sólo dos dimensiones, puede comprimir esto a un solo bucle usando una expresión list comprehension o generador, pero eso no es muy escalable o legible:

for cell in (cell for row in self.cells for cell in row): 
    do_something(cell) 

Si necesita escala esto a múltiples dimensiones y realmente quieres una lista plana, puedes write a flatten function.

+1

Lo entendiste mal. Debería ser: para celda en [celda para fila en self.cells para celda en fila]: do_something (celda) – xApple

+0

Guau, esta respuesta es antigua. Tienes razón; Arreglará. – Eevee

+0

¿No es la forma en que lo hizo bien? Es solo una expresión de generador en lugar de una lista de comprensión ... ¿Me estoy perdiendo algo? O.o –

4

¿Qué tal esto:

import itertools 
for cell in itertools.chain(*self.cells): 
    cell.drawCell(surface, posx, posy) 
+0

' itertools.chain.from_iterable (self.cells) ' – jfs

26

Si es necesario cambiar los valores de las celdas individuales a continuación ndenumerate (en numpy) es su amigo. ¡Incluso si no lo haces, probablemente todavía lo sea!

for index,value in ndenumerate(self.cells): 
    do_something(value) 
    self.cells[index] = new_value 
6

se puede obtener el índice de cada elemento, así como el propio elemento utilizando enumerar comando:

for (i,row) in enumerate(cells): 
    for (j,value) in enumerate(row): 
    print i,j,value 

i, j contienen el índice de la fila y la columna del elemento y value es el propio elemento .

2

Nadie tiene una respuesta que va a funcionar forma arbitraria muchas dimensiones sin numpy, así que voy a poner aquí una solución recursiva que he utilizado

def iterThrough(lists): 
    if not hasattr(lists[0], '__iter__'): 
    for val in lists: 
     yield val 
    else: 
    for l in lists: 
     for val in iterThrough(l): 
     yield val 

for val in iterThrough(
    [[[111,112,113],[121,122,123],[131,132,133]], 
    [[211,212,213],[221,222,223],[231,232,233]], 
    [[311,312,313],[321,322,323],[331,332,333]]]): 
    print(val) 
    # 111 
    # 112 
    # 113 
    # 121 
    # .. 

Esto no tiene muy buena pero la comprobación de errores funciona para mí

Cuestiones relacionadas