如何将迭代器中的数据转移到另外两个迭代器中?
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
否则,如果您对迭代器调用顺序有更多控制权,则必须使用这些知识来实现更加自定义和优化的方式来在迭代器值之间切换。
我知道我可以使用
复制一个迭代器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
否则,如果您对迭代器调用顺序有更多控制权,则必须使用这些知识来实现更加自定义和优化的方式来在迭代器值之间切换。