2011-11-01 8 views
6

Czy python ma sposób na wykonanie foreach do tyłu? Mam nadzieję, że zrobię filtr() (lub zrozumienie listy) i jednocześnie odwrócę listę, aby uniknąć tego osobno (co, jak podejrzewam, będzie wolniejsze). Używam Pythona 2.4 (muszę niestety), ale jestem również ciekawy, jakie rozwiązanie do sprawdzania listy znajdzie się w Pythonie 3.0.Python's foreach backward

Edit Oba te rozwiązania wydają się być takie same:

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

Nie jestem pewien, dlaczego istnieje podejrzenie, że będzie wolniejszy, przynajmniej do pewnego stopnia, że ​​trzeba się o to martwić. Brzmi to trochę jak przedwczesna optymalizacja. –

+0

Po prostu wydawało mi się, że filtr() przechodzi jeden raz, a rewers() przechodzi drugi raz, więc pomyślałem, że jest sposób na zrobienie tego jednym przejściem. – shadowland

+3

Zawsze można rozwinąć te dwa ręcznie, ale nie będzie to szybsze, jeśli napisane w Pythonie, a narzut prawie na pewno (* szczególnie * jeśli nie masz twardych danych, aby udowodnić inaczej) nie jest warte napisania rozszerzenia C moduł. A to przy założeniu, że napiszesz porównanie także w C, a ponowne wywołanie Pythona dla każdego elementu znacznie zmniejszy potencjalny zysk. – delnan

Odpowiedz

1

To nie jest właściwy sposób to zrobić w tym samym czasie z filtrowaniem. Po prostu użyj reverse, będzie to o wiele bardziej zoptymalizowane niż robienie tego ręcznie.

15

Szukasz wbudowanych reversed():

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

tej iteruje sekwencji w odwrotnej kolejności, bez tworzenia dodatkowych kopii listy.