2015-05-14 22 views
2

我試圖創建一個迭代器,它懶洋洋地創建(可能無限多)一個迭代器的副本。這可能嗎?在python中,我可以使用tee懶惰地生成一個迭代器的副本嗎?

我知道我可以簡單地做

iter_copies = tee(my_iter, n=10) 

創建副本的任何固定數量有限,但這打破了,如果你不知道N.提前或如果n是無限的。

我通常會嘗試沿着

def inf_tee(my_iter): 
    while True: 
     yield tee(my_iter)[1] 

線條的東西,但是文檔指出使用上一個迭代三通後可以不再使用原來的迭代器,所以這是不行的。


如果您感興趣的應用程序:這個想法是創建一個懶惰的unzip功能,可能在pytoolz使用。我目前的實現可以處理有限數量的無限迭代器(它比簡單的zip(*seq)更好),但不是無限數量的無限迭代器。如果您對細節感興趣,請撥打pull request

回答

2

這僅勉強當在靠近itertools文檔底部的單個示例觸摸,但itertools.tee支持複印:

import itertools, copy 

def infinite_copies(some_iterable): 
    master, copy1 = itertools.tee(some_iterable) 
    yield copy1 
    while True: 
     yield copy.copy(master) 

在文檔中的例子實際使用__copy__魔術方法,這是鉤用於自定義copy.copy行爲。

請注意,這將需要存儲原始迭代器生成的每個元素,這可能會非常昂貴。無法避免這種成本。

+0

太棒了!奇怪的是,這個例子('tee_lookahead'的權利?)在2.7文檔中,但不在3.4文檔中。你知道這是否有充分的理由嗎? – dshepherd

+1

@dshepherd:不知道。該方法在Python 3中仍然存在,但該示例不是。 – user2357112

+0

那麼它似乎仍然在python 3中工作。 – dshepherd

相關問題