2011-10-21 27 views
23

Uso un sacco di maglie N dimensionali e diventa difficile dover scrivere un codice così indentato e so che alcuni codici possono essere sostituiti con le list comprehensions e le istruzioni inline. Per esempio:Comprensione degli elenchi per i loop Python

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

può essere sostituito con:

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

Ma come avrei potuto modificare l'azione, invece di stampa per fare qualcosa di diverso, come:

total = x+y 

Quindi quello che voglio fare è qualcosa di simile:

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

Tuttavia questo non funziona

C'è un modo intelligente per fare questo, piuttosto che:

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

che ne dici di usare un editor migliore, che fa l'intento per te, dal momento che sembra essere il tuo vero problema. A mio parere, il codice originale che hai pubblicato come esempio è quello che è il più facile da leggere. –

risposta

30

sum lavora qui:

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

Questa è la soluzione più facile da comprendere. – oligofren

5

Usa numpy. Ciò consente di utilizzare le matrici che si aggiungono come vettori:

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

Con la domanda di modifica, aggiungere una chiamata a sum così

total = numpy.sum(x+y) 
12

In alternativa alla scrittura loop N livelli di profondità, è possibile utilizzare 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 

Questo si estende naturalmente a N dimensioni.

+0

+1 per itertools! –

2

ridurre la funzione riduce direttamente elementi collettivi per singolo elemento. È possibile read more about them here, ma questo dovrebbe funzionare per voi:

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

o

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

Un'altra possibilità è:

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) 

In questo modo è possibile iterare su tutto quello che usereste in una lista di comprensione senza effettivamente creare la lista comprensiva (se hai capito il mio significato;) Se la lista comprensiva è grande, forse così grande che si satura o addirittura non si adatta alla memoria, è abbastanza utile ..

Problemi correlati