我正在寻找一种方法来反转生成器对象。我知道如何反转序列:
foo = imap(seq.__getitem__, xrange(len(seq)-1, -1, -1))
但类似的情况可能与生成器作为输入,反向生成器作为输出(len(seq)保持不变,因此可以使用原始序列中的值)?
答案 0 :(得分:23)
除非将生成器转换为序列并从中创建迭代器,否则不能以任何通用方式反转生成器。在计算出先前的生成器之前,不一定知道生成器的后期术语。
更糟糕的是,你无法知道你的发生器是否会遇到StopIteration异常,直到你击中它,所以你无法知道序列中的第一个术语会是什么。
你能做的最好的事情就是写一个reversed_iterator函数:
def reversed_iterator(iter):
return reversed(list(iter))
编辑:当然,您也可以使用基于imap的迭代版本替换逆转,以保存一个列表创建。
答案 1 :(得分:6)
reversed(list(input_generator))
可能是最简单的方式。
没有办法以“反向”顺序获取生成器的值,而不首先将它们全部收集到序列中,因为生成第二个项目很可能完全依赖于生成的第一个项目。
答案 2 :(得分:4)
你必须穿过发电机才能得到第一个项目,这样你就可以制作一个清单。尝试
reversed(list(g))
其中g
是生成器。
reversed(tuple(g))
也会起作用(我没有检查性能是否存在显着差异)。
答案 3 :(得分:0)
def reverseGenerator(gen):
new = [i for i in gen]
yield new[::-1][0]
new.pop()
yield from reverseGenerator(i for i in new)