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