Python反向生成器

时间:2009-10-13 16:04:25

标签: python generator reverse

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

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

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

4 个答案:

答案 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)