Python 反向生成器
我想找个方法来反转一个生成器对象。我知道怎么反转序列:
foo = imap(seq.__getitem__, xrange(len(seq)-1, -1, -1))
但是,能不能用生成器作为输入,得到一个反转后的生成器作为输出呢?(序列的长度保持不变,所以可以使用原始序列中的值)
5 个回答
4
你必须先遍历这个生成器才能得到第一个项目,所以不如直接把它变成一个列表。可以试试这个:
reversed(list(g))
这里的 g
是一个生成器。
reversed(tuple(g))
这个方法也可以用(我没有检查性能上是否有明显的差别)。
6
reversed(list(input_generator))
可能是最简单的方法。
要想把生成器的值反向排列,必须先把它们都收集到一个序列里,因为生成第二个值可能需要依赖第一个值已经生成。
36
你不能用通用的方法来反转一个生成器,除非把它转换成一个序列,然后再从中创建一个迭代器。因为生成器的后面部分在前面的部分计算出来之前,可能是无法知道的。
更糟糕的是,你无法提前知道你的生成器是否会遇到一个叫做StopIteration的异常,直到你真的遇到它为止。所以你根本无法知道你的序列中是否会有第一个元素。
你能做的最好的办法就是写一个叫做reversed_iterator的函数:
def reversed_iterator(iter):
return reversed(list(iter))
补充说明:当然,你也可以用基于imap的迭代版本来替换这个reversed,这样可以省去创建一个列表的步骤。