[Python] ciclo for dentro un ciclo for

Giovanni Marco Dall'Olio dalloliogm a gmail.com
Mer 10 Mar 2010 14:20:43 CET


2010/3/10 Nicola Ferrari <nick.ferro a gmail.com>:
>
> ma se avessi una "li" di 200 elementi, risulterebbe pesante...
> Qualche idea per migliorare il tutto?

Penso sia la stessa domanda proposta qui:
- http://stackoverflow.com/questions/2355542/ugly-combination-of-generator-expression-with-for-loop

Se ho capito bene il problema:
>>> l1 = range(1, 3)
[1, 2, 3]
>>> l2 = 'abs'.split('')
['a', 'b', 'c']
>>> def check(x):
...         return x > 1

un po' di consigli sparsi:
- in genere, le list comprehension sono piú veloci dei cicli, per cui
ti conviene utilizzarle dove possibile
>>> [(e1, e2) for e1 in l1 for e2 in l2]
>>> [(e1, e2) for e1 in l1 for e2 in l2 if check(e2) is True]
 [(2, 'a'), (2, 'b'), (2, 'c'), (3, 'a'), (3, 'b'), (3, 'c')]

- se usi xrange() al posto di range(), risparmi un bel po' di memoria
ram, perché non ti genera una lista con 100 elementi ma un oggetto che
ti ritorna il numero successivo ogni volta che viene chiamato.
help(xrange) per i dettagli
>>> for n in xrange(100): print x

- itertools.ifilter ti permette di applicare una funziona a tutti gli
elementi di una lista e ritornare solo quelli per cui questa ritorna
True, in una unica operazione e molto piu' velocemente (perché é
scritto in C e si applica ad un array)

- itertools.product dovrebbe darti il prodotto cartesiano, ma mi
sembra che non vi sia almeno in python2.5, e per il momento non te lo
posso provare (sono su una vecchia ubuntu).



> Grazie
>
>
>
>
> _______________________________________________
> Python mailing list
> Python a lists.python.it
> http://lists.python.it/mailman/listinfo/python
>
>



-- 
Giovanni Dall'Olio, phd student
Department of Biologia Evolutiva at CEXS-UPF (Barcelona, Spain)

My blog on bioinformatics: http://bioinfoblog.it


Maggiori informazioni sulla lista Python