题
我在寻找一种方法来扭转发电机对象。我知道如何扭转序列:
foo = imap(seq.__getitem__, xrange(len(seq)-1, -1, -1))
但是,类似于能够以发电机作为输入和反转发电机作为输出(LEN(SEQ)保持不变,所以从原来的序列的值都可以使用)的东西吗?
解决方案
可以不扭转任何通用的方式的发电机除非它浇注到一个序列和创建从该迭代器。发电机后来方面不一定能知道,直到与先前的已经被计算。
更糟糕的是,你可以不知道,如果你的发电机都不会打了一个StopIteration异常,直到你打它,所以没有办法知道甚至会出现在你的序列中的第一项。
您可以做的是写一个reversed_iterator功能最好的:
def reversed_iterator(iter):
return reversed(list(iter))
编辑:您还可以,当然,顶替扭转了这个与你的基于IMAP的迭代版本,以节省一个列表创建
其他提示
reversed(list(input_generator))
可能是最简单的方法。
有没有办法在“反向”为了获得发电机的值,而无需收集所有这些成序列第一,因为产生第二项很可能依赖于所述第一已生成。
您必须通过发电机步行反正拿到的第一个项目,所以你还不如做一个清单。尝试
reversed(list(g))
其中g
是发电机。
reversed(tuple(g))
将工作以及(我没有检查,看看是否有在性能上显著差异)。
不隶属于 StackOverflow