我正在努力写这样的事情:
list(reversed(list(el.iterancestors()))) + [1,2,3]
生成器很糟糕,因为我被迫将它们用于列表中。
有没有办法简化这个?我认为reversed()
应该接受迭代器,我错了吗?
答案 0 :(得分:9)
不保证发电机有最后一项,因此无法逆转。以下是什么输出?
from itertools import cycle
reversed(cycle('abc'))
还有意外吞食所有记忆的风险:
from itertools import permutations
reversed(permutations('abcdefghijklmnopqrstuvwxyz', 10)) # 19,275,223,968,000 tuples
请注意,reversed()
的要点是内存效率。对于序列,具有索引(列表,字符串,元组,范围)的对象,reversed()
生成一个使用内部索引的迭代器,该索引从len(inputobject) - 1
开始,然后向下进展到0
当你迭代。它永远不必以这种方式创建输入序列的副本,但该技巧只能用于已经具有长度并支持随机访问的内容。
对于你的案例我不会使用reversed()
。您希望列表作为输出,而不是生成器,因此请使用切片来反转列表:
list(el.iterancestors())[::-1] + [1, 2, 3]
此处的内存效率不是问题,因为您正在构建新的列表对象。