как зацикливаться в списке питонов (обратный отсчет) - PullRequest
7 голосов
/ 08 июля 2011

как зацикливаться в списке питонов?

например

loop:

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

loop down:

L = [1,2,3]
for ???
    print item #-->3,2,1

спасибо

Ответы [ 4 ]

16 голосов
/ 08 июля 2011

Батареи включены.

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 голосов
/ 08 июля 2011

В обратном порядке.

L = [1,2,3]
for item in reversed(L)
    print item #-->3,2,1
6 голосов
/ 08 июля 2011

Другое решение:

for item in L[::-1]:
    print item
3 голосов
/ 25 января 2014

Я знаю, что этой теме уже несколько лет, но комментарий под принятым ответом содержит утверждение, что использование [::-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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...