2011-07-08 1 views

Odpowiedz

6

Innym rozwiązaniem:

for item in L[::-1]: 
    print item 
+2

Należy zauważyć, że spowoduje to tymczasowe utworzenie odwróconej kopii sekwencji, natomiast 'odwróć()' będzie kopiować tylko w razie potrzeby. –

+2

+3 do tworzenia kopii? Przepraszam, ale to zasługuje na -3 –

+0

'L [:: - 1]:' działa szybciej niż 'odwrotnie (L)' –

16

Batteries included.

for i in reversed([1, 2, 3]): 
    print i 

Krojenie listę (ls[::-1]) doskonale nadaje się do tworzenia odwróconą kopię, ale na moim komputerze jest wolniejszy dla iteracji, nawet jeśli lista jest już w pamięci:

>>> def sliceit(x): 
...  l = range(x) 
...  for i in l[::-1]: 
...   i 
...  
>>> def reverseit(x): 
...  l = range(x) 
...  for i in reversed(l): 
...   i 
...   
>>> %timeit sliceit(100) 
100000 loops, best of 3: 4.04 µs per loop 
>>> %timeit reverseit(100) 
100000 loops, best of 3: 3.79 µs per loop 
>>> %timeit sliceit(1000) 
10000 loops, best of 3: 34.9 µs per loop 
>>> %timeit reverseit(1000) 
10000 loops, best of 3: 32.5 µs per loop 
>>> %timeit sliceit(10000) 
1000 loops, best of 3: 364 µs per loop 
>>> %timeit reverseit(10000) 
1000 loops, best of 3: 331 µs per loop 

Jak to często prawdziwe w takich przypadkach różnica jest dość znikoma. Może być różny dla różnych wersji Pythona (do powyższego testu użyłem Pythona 2.7). Prawdziwa korzyść z używania reversed jest czytelna - w większości przypadków byłaby lepsza, nawet jeśli kosztowałaby kilka dodatkowych mikrosekund.

7

Odwróć sekwencję.

L = [1,2,3] 
for item in reversed(L) 
    print item #-->3,2,1 
3

Znam ten wątek jest teraz lat, ale komentarz pod przyjętym odpowiedź zawiera twierdzenie, że za pomocą [::-1] jest szybsze niż przy użyciu reversed(). Jest to prawdą tylko wtedy, gdy twoja lista jest jawnie umieszczona w pamięci, co jest niezbę dne podczas robienia odliczania . Inaczej jest wolniejsze:

>>> timeit.Timer(stmt="range(1,1000)[::-1]").timeit() 
10.801303316066111 
>>> timeit.Timer(stmt="list(reversed(xrange(1,1000)))").timeit() 
9.484562358901144 

... i[::-1] zajmuje więcej miejsca niż reversed.

+0

Na moim komputerze 'odwrócony' jest szybszy nawet dla list już w pamięci. (Sprawdź czasy w mojej edytowanej odpowiedzi.) – senderle