2011-07-08 12 views

答えて

6

別の解決策:

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

これは、シーケンスの逆コピーを一時的に作成しますが、 'reversed()'は必要な場合にのみコピーすることに注意してください。 –

+2

+3コピーを作成しますか?残念ですが、これは-3 –

+0

'L [:: - 1]:'逆転(L)より速く実行するに値する –

16

Batteries included.

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

リスト(ls[::-1])をスライスすると逆のコピーを作るための素晴らしいですが、私のマシン上では、リストは、メモリ内に既にある場合でも、繰り返しのために遅くなります。このような場合にしばしばそうであるよう

>>> 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 

違いはごくわずかです。 Pythonのバージョンによって異なるかもしれません(私は上記のテストでPython 2.7を使用しました)。 reversedを使用することの本当のメリットは読みやすさです。ほんの数マイクロ秒かかる場合でもほとんどの場合、これが望ましいでしょう。

7

シーケンスを逆にします。

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

私はこのスレッドは今歳ですけど、受け入れ答えの下のコメントは[::-1]を使用してreversed()を使用するよりも高速であるという主張が含まれています。これは、リストが明示的にメモリに格納されている場合にのみ当てはまります。ではなく、カウントダウンの際にはが必要です。それ以外の場合は遅いです:

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

... [::-1]reversedより多くのスペースを使用しています。

+0

私のコンピュータ上では、すでにメモリに入っているリストであっても 'reversed'が速くなります。 (私の編集された答えのタイミングを参照してください。) – senderle