24

我正在寻找一种反转生成器对象的方法。我知道如何反转序列:

foo = imap(seq.__getitem__, xrange(len(seq)-1, -1, -1))

但是,将生成器作为输入,将反向生成器作为输出(len(seq) 保持不变,因此可以使用原始序列中的值),是否有类似的可能?

4

4 回答 4

33

您不能以任何通用方式反转生成器,除非将其转换为序列并从中创建迭代器。在计算较早的项之前,不一定知道生成器的后期项。

更糟糕的是,您无法知道您的生成器是否会遇到 StopIteration 异常,直到您遇到它,因此无法知道您的序列中甚至会有第一项。

你能做的最好的就是编写一个 reversed_iterator 函数:

def reversed_iterator(iter):
    return reversed(list(iter))

编辑:当然,您也可以将 reversed in this 替换为基于 imap 的迭代版本,以保存一个列表创建。

于 2009-10-13T16:15:58.687 回答
6

reversed(list(input_generator))可能是最简单的方法。

如果不首先将它们全部收集到一个序列中,就无法以“反向”顺序获取生成器的值,因为生成第二个项目很可能依赖于已生成的第一个项目。

于 2009-10-13T16:13:18.123 回答
4

无论如何,您必须遍历生成器才能获得第一个项目,因此您不妨列一个清单。尝试

reversed(list(g))

g发电机在哪里。

reversed(tuple(g))

也可以(我没有检查性能是否有显着差异)。

于 2009-10-13T16:13:19.560 回答
-1
def reverseGenerator(gen):
     new = [i for i in gen]
     yield new[::-1][0]
     new.pop()
     yield from reverseGenerator(i for i in new)
于 2020-08-29T08:59:33.823 回答