Python中逆序遍历列表
如何在Python中逆序遍历列表? 因此,我可以从 collection[len(collection)-1]
开始,并以 collection[0]
结束。
我还希望能够访问循环索引。
How do I traverse a list in reverse order in Python? So I can start from collection[len(collection)-1]
and end in collection[0]
.
I also want to be able to access the loop index.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(28)
使用内置的
reversed()
函数:要访问原始索引,请使用
enumerate()
在将其传递给reversed()
之前,先将其添加到您的列表中:由于
enumerate()
返回一个生成器,并且生成器无法反转,因此您需要将其转换为首先列出
。Use the built-in
reversed()
function:To also access the original index, use
enumerate()
on your list before passing it toreversed()
:Since
enumerate()
returns a generator and generators can't be reversed, you need to convert it to alist
first.您可以执行以下操作:(
或者您想在 for 循环中执行的任何操作。)
[::-1]
切片会反转 for 循环中的列表(但实际上不会“永久”修改您的列表) ”)。You can do:
(Or whatever you want to do in the for loop.)
The
[::-1]
slice reverses the list in the for loop (but won't actually modify your list "permanently").可以这样完成:
所以你的猜测非常接近:)有点尴尬,但它基本上是说:从 len(collection) 少 1 开始,继续直到你到达 -1 之前,步长为-1。
仅供参考,
help
函数非常有用,因为它可以让您从 Python 控制台查看某些内容的文档,例如:help(range)
It can be done like this:
So your guess was pretty close :) A little awkward but it's basically saying: start with 1 less than
len(collection)
, keep going until you get to just before -1, by steps of -1.Fyi, the
help
function is very useful as it lets you view the docs for something from the Python console, eg:help(range)
如果您需要循环索引,并且不想两次遍历整个列表或使用额外的内存,我会编写一个生成器。
If you need the loop index, and don't want to traverse the entire list twice, or use extra memory, I'd write a generator.
一种没有导入的方法:
时间复杂度 O(n) 和空间复杂度 O(1)。
在内存中创建新列表的方法,请注意大型列表:
时间复杂度 O(n) 和空间复杂度 O(n)。
An approach with no imports:
Time complexity O(n) and space complexity O(1).
An approach that creates a new list in memory, be careful with large lists:
Time complexity O(n) and space complexity O(n).
reversed
内置函数很方便:文档< /a> for returned 解释了它的局限性。
对于我必须与索引一起反向遍历序列的情况(例如,对于更改序列长度的就地修改),我在我的 codeutil 模块中定义了此函数:
此函数可以避免创建序列的副本。 显然,
反向
限制仍然适用。The
reversed
builtin function is handy:The documentation for reversed explains its limitations.
For the cases where I have to walk a sequence in reverse along with the index (e.g. for in-place modifications changing the sequence length), I have this function defined an my codeutil module:
This one avoids creating a copy of the sequence. Obviously, the
reversed
limitations still apply.此外,您可以使用“范围”或“计数”函数。
如下:
您还可以使用 itertools 中的“count”,如下所示:
Also, you could use either "range" or "count" functions.
As follows:
You could also use "count" from itertools as following:
在 python 3 中,list 创建一个副本,因此
reversed(list(enumerate(collection))
可能效率低下,生成另一个列表并没有被优化掉。如果 collection 确实是一个列表,那么它可能最好将复杂性隐藏在迭代器后面
,因此,最干净的是:
In python 3, list creates a copy, so
reversed(list(enumerate(collection))
could be inefficient, generating yet an other list is not optimized away.If collection is a list for sure, then it may be best to hide the complexity behind an iterator
so, the cleanest is:
如果不重新创建新列表,您可以通过索引来完成:
或者
How about without recreating a new list, you can do by indexing:
OR
或者
OR
我喜欢单线生成器方法:
I like the one-liner generator approach:
使用
list.reverse()
,然后像平常一样进行迭代。Use
list.reverse()
and then iterate as you normally would.http://docs.python.org/tutorial/datastructures.html
不管它的价值如何,你也可以这样做。 很简单。
for what ever it's worth you can do it like this too. very simple.
如果您需要索引并且列表很小,那么最易读的方法是像接受的答案所述那样执行
reversed(list(enumerate(your_list)))
。 但这会创建列表的副本,因此如果列表占用了大部分内存,则必须从len 中减去
。enumerate(reversed())
返回的索引()-1如果您只需要执行一次:
或者如果您需要执行多次,则应该使用生成器:
If you need the index and your list is small, the most readable way is to do
reversed(list(enumerate(your_list)))
like the accepted answer says. But this creates a copy of your list, so if your list is taking up a large portion of your memory you'll have to subtract the index returned byenumerate(reversed())
fromlen()-1
.If you just need to do it once:
or if you need to do this multiple times you should use a generator:
假设任务是找到满足列表中某些条件的最后一个元素(即向后查看时的第一个元素),我得到以下数字。
Python 2:
因此,最丑陋的选项 xrange(len(xs)-1,-1,-1) 是最快的。
Python 3(不同的机器):
这里,
enumerate(reversed(xs), 1)
是最快的。Assuming task is to find last element that satisfies some condition in a list (i.e. first when looking backwards), I'm getting following numbers.
Python 2:
So, the ugliest option
xrange(len(xs)-1,-1,-1)
is the fastest.Python 3 (different machine):
Here,
enumerate(reversed(xs), 1)
is the fastest.如果你不介意索引为负,你可以这样做:
If you don't mind the index being negative, you can do:
我认为最优雅的方法是使用以下生成器来转换枚举和反转,
该生成器生成枚举的反向迭代器
示例:
结果:
I think the most elegant way is to transform
enumerate
andreversed
using the following generatorwhich generates a the reverse of the
enumerate
iteratorExample:
Result:
反向函数在这里派上用场:
the reverse function comes in handy here:
要使用负索引:从 -1 开始,每次迭代后退 -1。
To use negative indices: start at -1 and step back by -1 at each iteration.
您还可以使用
while
循环:You can also use a
while
loop:您可以在普通的 for 循环中使用负索引:
要像在集合的反向副本上向前迭代一样访问索引,请使用 i - 1:
要访问原始的、未反向的索引,使用 len(collection) - i:
You can use a negative index in an ordinary for loop:
To access the index as though you were iterating forward over a reversed copy of the collection, use
i - 1
:To access the original, un-reversed index, use
len(collection) - i
:作为 python 的初学者,我发现这种方式更容易理解并且反转列表。
As a beginner in python, I found this way more easy to understand and reverses a list.
其他答案都很好,但如果你想做
列表理解风格
The other answers are good, but if you want to do as
List comprehension style
我认为这也是一种简单的方法...从末尾读取并不断递减直到列表的长度,因为我们从不执行“结束”索引,因此也添加了-1
i think this one is also simple way to do it... read from end and keep decrementing till the length of list, since we never execute the "end" index hence added -1 also
我很困惑为什么到目前为止没有弹出明显的选择:
如果
reversed()
不起作用,因为你有一个生成器(如enumerate()
的情况) ,只需使用sorted()
:I'm confused why the obvious choice did not pop up so far:
If
reversed()
is not working because you have a generator (as the case withenumerate()
), just usesorted()
:一个简单的方法:
A simple way :
你可以使用生成器:
最后:
希望这对你有帮助。
you can use a generator:
finally:
hope this help you.