Me gusta la compren sión de listas

Andrés Marzal Varo amarzal en alumail.uji.es
Mar Abr 22 10:44:26 CEST 2003


> Por ejemplo, estoy dándole vueltas a un problema. Tengo una lista de  
> 1.000.000 de elementos y quiero sacar los primeros 100 elementos que  
> estén en posiciones pares. La comprensión de listas me obliga a revisar  
> todo el millón de elementos, algo que es una barbaridad:  
>   
> [L[i] for i in xrange(len(L)) if i%2==0][:100]  
  
No hace falta. Tienes un par de alternativas:  
  
[L[i] for i in range(len(L))[:100] if i%2==0]  
  
[L[i] for i in xrange(min(100, len(L))) if i%2==0]  
 
Aunque yo optaría por usar xrange o range con tres parámetros: 
 
[L[i] for i in xrange(0,min(100, len(L)),2)] 
 
De todos modos, Python 2.3 ofrecerá soluciones más elegantes. El operador 
de corte se enriquece. Lo que propones se podrá hacer así (creo): 
 
L[0:100:2] 
  
> Utilizando el enumerate() de python 2.3 y un hipotético operador de  
> corte, sí que se podría hacer algo tal que así:  
>   
> [ L[fi] for (i,fi) in enumerate(fib()) while i<100 ]  
  
La cosa es fácil con generadores: 
 
>>> def fib(): 
...     a, b = 1, 1 
...     yield a 
...     while 1: 
...             a, b = b, a+b 
...             yield a 
... 
>>> f = fib() 
>>> [f.next() for i in range(10)] 
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55] 
 
Salud. 
 
Andrés. 
  

------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es


Más información sobre la lista de distribución Python-es