如何将迭代器中的数据转移到另外两个迭代器中?

How to divert data in an iterator into two others?

我知道我可以使用

复制一个迭代器

x1, x2 = itertools.tee(x)

然后,为了获得两个生成器,我可以过滤:

filter(..., x1); filter(..., x2)

但是,我会 运行 两次相同的计算,即在 x1 和 x2 中遍历 x。

因此,我会做一些更有效的事情:

x1, x2 = divert(into x1 if ... else x2, x)

python3 中是否存在类似的东西?

据我所知,没有用 python 编写的内置工具。开始工作有点技巧,因为无法保证您可以生成的每个迭代器的调用顺序。

例如 x 可以产生一个 x1 值,然后是一个 x2 值,但是您的代码可以迭代 x1 直到它产生一个信号值,然后迭代 x2 直到它产生一个信号值...所以基本上代码必须保存所有 x2 值直到生成 x1 值,这可以任意延迟。

如果这确实是您想要做的,这里有一个关于如何做这个缓冲区的快速想法。警告,它根本没有经过测试,假设 x 是一个无穷无尽的生成器。另外,您必须编写两个实际的迭代器 class 来实现 __next__ 并引用此通用迭代器,一个使用 category==True,另一个使用 category==False.

class SeparatedIterator:
    def __init__( self, iterator, filter ):
        self.it = iterator
        self.f = filter
        #The buffer contains pairs of (value,filterIsTrue)
        self.valueBuffer = []

    def generate():
        value = next( self.it )
        filtered = self.f( value )
        self.valueBuffer.append(( value, filtered ))

    def nextValue( category ):
        #search in stored values
        for i in range(len(self.valueBuffer)):
            value, filtered = self.valueBuffer[i]
            if filtered == category:
                del self.valueBuffer[i]
                return value

        #else, if none of the category found,
        #generate until one of the category is made
        self.generate()
        while self.valueBuffer[-1][1] != category:
            self.generate()

        #pop the value and return it
        value, _ = self.valueBuffer.pop()
        return value

否则,如果您对迭代器调用顺序有更多控制权,则必须使用这些知识来实现​​更加自定义和优化的方式来在迭代器值之间切换。