2011-11-01 8 views
6

Python ha un modo per fare foreach all'indietro? Spero di fare un filtro() (o una lista di comprensione) e invertire una lista allo stesso tempo, in modo che io possa evitare di farlo separatamente (che sospetto sarà più lento). Sto usando Python 2.4 (devo sfortunatamente), ma sono anche curioso di sapere quale sarebbe la soluzione di comprensione delle liste in python 3.0.Python foreach all'indietro

Modifica Entrambe queste soluzioni sembrano essere la stessa:

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

Non sono sicuro perché si sospetta che sarebbe stato più lento, almeno fino a un punto che si dovrebbe preoccupare. Questo suona un po 'come l'ottimizzazione prematura per me. –

+0

Mi è sembrato come filter() passare una volta e reverse() attraversa una seconda volta, quindi ho pensato che ci sarebbe stato un modo per farlo con una traversata. – shadowland

+3

Puoi sempre srotolare i due manualmente, ma non sarà più veloce se scritto in Python, e il sovraccarico quasi certamente (* specialmente * se non hai dati rigidi per dimostrare il contrario) non vale la pena scrivere un'estensione C modulo. E supponendo che tu scriva anche la comparazione in C, richiamare in Python per ogni oggetto ridurrà di molto ogni potenziale guadagno. – delnan

risposta

1

Non è il modo giusto per farlo nello stesso tempo con il filtraggio. Basta usare reverse, sarà molto più ottimizzato rispetto a farlo manualmente.

15

Stai cercando il built-in reversed():

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

Questo itera oltre la sequenza in senso inverso, senza creare una copia aggiuntiva della vostra lista.