为什么不反转()接受发电机?

now*_*wox 1 python reverse list generator

我正在努力写这样的事情:

list(reversed(list(el.iterancestors()))) + [1,2,3]
Run Code Online (Sandbox Code Playgroud)

生成器很糟糕,因为我被迫将它们用于列表中.

有没有办法简化这个?我认为reversed()应该接受迭代器,我错了吗?

Mar*_*ers 9

生成器不保证有最后一项,因此无法逆转.以下是什么输出?

from itertools import cycle

reversed(cycle('abc'))
Run Code Online (Sandbox Code Playgroud)

还有意外吃掉所有记忆的风险:

from itertools import permutations
reversed(permutations('abcdefghijklmnopqrstuvwxyz', 10)) # 19,275,223,968,000 tuples
Run Code Online (Sandbox Code Playgroud)

请注意,重点reversed()内存效率.对于序列,具有索引(列表,字符串,元组,范围)的对象reversed()生成一个使用内部索引的迭代器,该索引从迭代开始len(inputobject) - 1,然后向下0进行.它永远不必以这种方式创建输入序列的副本,但该技巧只能用于已经具有长度并支持随机访问的内容.

对于你的情况我会不会使用reversed() 反正.您希望列表作为输出,而不是生成器,因此请使用切片来反转列表:

list(el.iterancestors())[::-1] + [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

由于您正在构建新的列表对象,因此内存效率不是问题.