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