所以我可以从开始到len(collection)
结束collection[0]
。
我还希望能够访问循环索引。
所以我可以从开始到len(collection)
结束collection[0]
。
我还希望能够访问循环索引。
Answers:
使用内置reversed()
功能:
>>> a = ["foo", "bar", "baz"]
>>> for i in reversed(a):
... print(i)
...
baz
bar
foo
要同时访问原始索引,请enumerate()
在列表上使用,然后将其传递给reversed()
:
>>> for i, e in reversed(list(enumerate(a))):
... print(i, e)
...
2 baz
1 bar
0 foo
由于enumerate()
返回生成器并且生成器不能反转,因此需要将其转换为list
第一个。
reversed()
请勿修改列表。reversed()
不复制列表(否则将需要O(N)额外的内存)。如果需要修改列表,请使用alist.reverse()
;如果您需要按相反顺序使用列表的副本,请使用alist[::-1]
。
你可以做:
for item in my_list[::-1]:
print item
(或者您想要在for循环中执行的任何操作。)
该[::-1]
切片反转for循环在列表中(但不会实际修改列表的“永久”)。
[::-1]
创建一个浅表副本,因此它既不会“永久”也不会“临时”更改数组。
0
,可能是-1
,因此在开始时结束)和步骤:(一次-1
向后遍历列表,1
项目)。
reversed()
如果您需要循环索引,并且不想遍历整个列表两次,或者不想使用额外的内存,则可以编写一个生成器。
def reverse_enum(L):
for index in reversed(xrange(len(L))):
yield index, L[index]
L = ['foo', 'bar', 'bas']
for index, item in reverse_enum(L):
print index, item
reversed(xrange(len(L)))
产生与相同的索引xrange(len(L)-1, -1, -1)
。
for index, item in enumerate(reversed(L)): print len(L)-1-index, item
可以这样完成:
对于范围(len(collect)-1,-1,-1)中的i: 印刷品收藏[i] #为python 3打印(collection [i])。
因此,您的猜测非常接近:)有点尴尬,但这基本上是在说:从小于1开始len(collection)
,一直走到-1之前,以-1为步长。
Fyi,该help
功能非常有用,因为它使您可以从Python控制台查看文档,例如:
help(range)
-1
的东西看起来太奇怪了。我只会说reversed(xrange(len(collection)))
该reversed
内置功能非常方便:
for item in reversed(sequence):
该文档的反向解释它的局限性。
对于必须与索引一起反向遍历序列的情况(例如,对于更改序列长度的就地修改),我需要将此函数定义为我的codeutil模块:
import itertools
def reversed_enumerate(sequence):
return itertools.izip(
reversed(xrange(len(sequence))),
reversed(sequence),
)
这避免了创建序列的副本。显然,这些reversed
限制仍然适用。
另外,您可以使用“范围”或“计数”功能。如下:
a = ["foo", "bar", "baz"]
for i in range(len(a)-1, -1, -1):
print(i, a[i])
3 baz
2 bar
1 foo
您还可以按以下方式使用itertools中的“ count”:
a = ["foo", "bar", "baz"]
from itertools import count, takewhile
def larger_than_0(x):
return x > 0
for x in takewhile(larger_than_0, count(3, -1)):
print(x, a[x-1])
3 baz
2 bar
1 foo
3 foo\n2 bar\n1 baz
list.reverse()
照常使用,然后进行迭代。
reverse(enumerate(collection))
在python 3中实现的一种表达方式:
zip(reversed(range(len(collection))), reversed(collection))
在python 2:
izip(reversed(xrange(len(collection))), reversed(collection))
我不确定为什么我们没有快捷方式,例如:
def reversed_enumerate(collection):
return zip(reversed(range(len(collection))), reversed(collection))
还是为什么我们没有 reversed_range()
如果您需要索引并且列表很小,那么最容易理解的方法是reversed(list(enumerate(your_list)))
按照接受的答案进行操作。但这会创建列表的副本,因此,如果列表占用了很大一部分内存,则必须减去enumerate(reversed())
从中返回的索引len()-1
。
如果您只需要执行一次:
a = ['b', 'd', 'c', 'a']
for index, value in enumerate(reversed(a)):
index = len(a)-1 - index
do_something(index, value)
或者,如果您需要多次执行此操作,则应使用生成器:
def enumerate_reversed(lyst):
for index, value in enumerate(reversed(lyst)):
index = len(lyst)-1 - index
yield index, value
for index, value in enumerate_reversed(a):
do_something(index, value)
反向功能在这里很方便:
myArray = [1,2,3,4]
myArray.reverse()
for x in myArray:
print x
您可以在普通的for循环中使用负索引:
>>> collection = ["ham", "spam", "eggs", "baked beans"]
>>> for i in range(1, len(collection) + 1):
... print(collection[-i])
...
baked beans
eggs
spam
ham
要访问索引,就好像您正在遍历集合的反向副本一样,请使用i - 1
:
>>> for i in range(1, len(collection) + 1):
... print(i-1, collection[-i])
...
0 baked beans
1 eggs
2 spam
3 ham
要访问原始的非反向索引,请使用len(collection) - i
:
>>> for i in range(1, len(collection) + 1):
... print(len(collection)-i, collection[-i])
...
3 baked beans
2 eggs
1 spam
0 ham
input_list = ['foo','bar','baz']
for i in range(-1,-len(input_list)-1,-1)
print(input_list[i])
我认为这也是一种简单的方法...从末尾读取并不断递减直到列表的长度,因为我们从不执行“ end”索引,因此也添加了-1
假设任务是在列表中找到满足某些条件的最后一个元素(即向后看时的第一个元素),我得到以下数字:
>>> min(timeit.repeat('for i in xrange(len(xs)-1,-1,-1):\n if 128 == xs[i]: break', setup='xs, n = range(256), 0', repeat=8))
4.6937971115112305
>>> min(timeit.repeat('for i in reversed(xrange(0, len(xs))):\n if 128 == xs[i]: break', setup='xs, n = range(256), 0', repeat=8))
4.809093952178955
>>> min(timeit.repeat('for i, x in enumerate(reversed(xs), 1):\n if 128 == x: break', setup='xs, n = range(256), 0', repeat=8))
4.931743860244751
>>> min(timeit.repeat('for i, x in enumerate(xs[::-1]):\n if 128 == x: break', setup='xs, n = range(256), 0', repeat=8))
5.548468112945557
>>> min(timeit.repeat('for i in xrange(len(xs), 0, -1):\n if 128 == xs[i - 1]: break', setup='xs, n = range(256), 0', repeat=8))
6.286104917526245
>>> min(timeit.repeat('i = len(xs)\nwhile 0 < i:\n i -= 1\n if 128 == xs[i]: break', setup='xs, n = range(256), 0', repeat=8))
8.384078979492188
因此,最丑陋的选择xrange(len(xs)-1,-1,-1)
是最快的。