在列表上迭代两次的正确方法?

Pau*_*hen 6 python

在容器上执行多次迭代的正确方法是什么?从python文档:

迭代器 - 容器对象(例如列表)每次将它传递给iter()函数或在for循环中使用它时都会生成一个全新的迭代器.使用迭代器尝试此操作只会返回上一次迭代过程中使用的相同耗尽的迭代器对象,使其看起来像一个空容器.

协议的目的是一旦迭代器的next()方法引发StopIteration,它将继续在后续调用中这样做.不遵守此属性的实现被视为已损坏.(这个约束是在Python 2.3中添加的;在Python 2.2中,根据此规则会破坏各种迭代器.)

如果我有这个代码:

slist = [1,2,3,4]
rlist = reversed(slist)
list(rlist)
#[4,3,2,1]
tuple(rlist)
#()
Run Code Online (Sandbox Code Playgroud)

什么是两次迭代'rlist'的最简单,最正确的方法?

Fre*_*Foo 8

rlist = list(reversed(slist))
Run Code Online (Sandbox Code Playgroud)

然后根据需要迭代.这个技巧更普遍适用; 每当需要多次遍历迭代器时,将其转换为列表.这是一个代码片段,我将其复制粘贴到不同的项目中,以实现此目的:

def tosequence(it):
    """Turn iterable into a sequence, avoiding a copy if possible."""
    if not isinstance(it, collections.Sequence):
        it = list(it)
    return it
Run Code Online (Sandbox Code Playgroud)

(Sequence是列表,元组和许多自定义列表类对象的抽象类型.)


cmd*_*cmd 5

我不会将列表存储两次,如果你不能将它组合成迭代一次,那么我会

slist = [1,2,3,4]
for element in reversed(slist):
    print element  # do first iteration stuff
for element in reversed(slist):
    print element  # do second iteration stuff
Run Code Online (Sandbox Code Playgroud)

只需将reverse()视为在slist上设置反向迭代器即可.逆转是便宜的.话虽这么说,如果你只需要它反转,我会反转它,只是让它存储就像那样.

  • +1 - 调用 `reversed(slist)` 只会创建一个新的迭代器对象,它比创建整个列表的副本的 `list(reversed(slist))` 便宜得多。 (2认同)