2011-10-21 21 views
23

Utilizo una gran cantidad de matrices N dimensionales y me duele tener que escribir ese código sangrado y sé que algunos códigos pueden reemplazarse por listas de comprensión y declaraciones en línea. Por ejemplo:Comprensión de lista para bucles Python

for x in (0,1,2,3): 
    for y in (0,1,2,3): 
     if x < y: 
      print (x, y, x*y) 

se puede sustituir por:

print [(x, y, x * y) for x in (0,1,2,3) for y in (0,1,2,3) if x < y] 

Pero ¿cómo iba a cambiar la acción en lugar de impresión para hacer algo que se le parezca:

total = x+y 

Así que lo que quieren hacer es algo así como:

[(total+=x+y) for x in (0,1,2,3) for y in (0,1,2,3) if x < y] 

Sin embargo esto no funciona

¿Hay una manera inteligente de hacer esto en lugar de:

for x in (0,1,2,3): 
     for y in (0,1,2,3): 
      if x < y: 
       total+=x+y 
+0

qué tal si usas un mejor editor, eso es lo que buscas, ya que ese parece ser tu problema real. En mi opinión, el código original que publicaste como ejemplo es el que es más fácil de leer. –

Respuesta

30

sum trabaja aquí:

total = sum(x+y for x in (0,1,2,3) for y in (0,1,2,3) if x < y) 
+0

Esta es la solución más fácil de comprender por lejos. – oligofren

5

Uso numpy. Esto le permite utilizar matrices que se suman como vectores:

x = numpy.arange(3) 
y = numpy.arange(3) 
total = x + y 

Con la pregunta modificada, agregar una llamada a sum así

total = numpy.sum(x+y) 
12

como bucles niveles de N profunda una alternativa a la escritura, se puede usar itertools.product():

In [1]: import itertools as it 

In [2]: for x, y in it.product((0,1,2,3),(0,1,2,3)): 
    ...:  if x < y: 
    ...:   print x, y, x*y 

0 1 0 
0 2 0 
0 3 0 
1 2 2 
1 3 3 
2 3 6 

Esto se extiende naturalmente a N dimensiones.

+0

+1 para itertools! –

2

reducir la función reduce directamente los envíos agrupados en un solo elemento. Puede read more about them here, pero esto debería funcionar para usted:

total=reduce(lambda x,y:x+y,range(4)) 

o

total=reduce(lambda x,y:x+y,(0,1,2,3)) 
2

Otra posibilidad es:

for x,y in ((x,y) for x in (0,1,2,3) for y in (0,1,2,3) if x < y): 
    print (x, y, x * y) 

De esta manera se puede iterar sobre todo lo que tendría que utilizar en una lista de comprensión sin crear realmente la lista comprendida (si entiendes mi significado;) Si la lista comprendida es grande, tal vez tan grande que satura o incluso no cabe en la memoria, es bastante útil.

Cuestiones relacionadas