2011-11-01 27 views
6

¿Tiene python un medio para hacer foreach al revés? Espero hacer un filtro() (o enumerar la comprensión) y revertir una lista al mismo tiempo, de modo que pueda evitar hacerlo por separado (que sospecho que será más lento). Estoy usando python 2.4 (tengo que hacerlo por desgracia), pero también tengo curiosidad por saber cuál sería la solución de comprensión de listas en Python 3.0.Foreach de Python hacia atrás

Editar Ambas soluciones parecen ser la misma:

python -m timeit -s 'x=[1,2,3,4,5]*99; filter(lambda x: x == 5, reversed(x))' 
100000000 loops, best of 3: 0.0117 usec per loop 
python -m timeit -s 'x=[1,2,3,4,5]*99; x.reverse(); filter(lambda x: x == 5, x)'  
100000000 loops, best of 3: 0.0117 usec per loop 
+2

No estoy seguro de por qué se sospecha que sería más lenta, por lo menos en un punto que usted debe preocuparse por ello. Esto suena un poco como una optimización prematura para mí. –

+0

Me pareció que filter() pasa una vez y reverse() pasa por segunda vez, así que pensé que habría una forma de hacerlo con un recorrido. – shadowland

+3

Siempre puede desenrollar los dos manualmente, pero eso no será más rápido si está escrito en Python, y la sobrecarga es casi seguro (* especialmente * si no tiene datos duros para demostrar lo contrario) no vale la pena escribir una extensión C módulo. Y eso suponiendo que también escriba la comparación en C, volver a llamar a Python para cada elemento reducirá en gran medida cualquier ganancia potencial. – delnan

Respuesta

1

No es la forma correcta de hacerlo en el mismo tiempo con el filtrado. Simplemente use reverse, estará mucho más optimizado que hacerlo manualmente.

15

Usted está buscando los incorporados en reversed():

>>> for i in reversed(range(5)): 
...  print i 
... 
4 
3 
2 
1 
0 

Este itera sobre la secuencia a la inversa, sin crear una copia adicional de su lista.