【发布时间】:2011-07-08 04:52:46
【问题描述】:
如何在python列表中向下循环?
例如
循环:
L = [1,2,3]
for item in L
print item #-->1,2,3
循环往下:
L = [1,2,3]
for ???
print item #-->3,2,1
谢谢
【问题讨论】:
如何在python列表中向下循环?
例如
循环:
L = [1,2,3]
for item in L
print item #-->1,2,3
循环往下:
L = [1,2,3]
for ???
print item #-->3,2,1
谢谢
【问题讨论】:
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 的真正好处是可读性——在大多数情况下它会更可取,即使它需要额外花费几微秒。
【讨论】:
颠倒顺序。
L = [1,2,3]
for item in reversed(L)
print item #-->3,2,1
【讨论】:
另一种解决方案:
for item in L[::-1]:
print item
【讨论】:
reversed() 只会在需要时进行复制。
L[::-1]: 跑得比reversed(L)快
reversed(L) 比 L[::-1] 快。
我知道这个帖子已经有好几年了,但是在接受的答案下的评论包含使用[::-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 多。
【讨论】:
reversed 更快,即使对于已经在内存中的列表也是如此。 (请参阅我编辑的答案的时间安排。)