itertools.teeの動作方法は、「ステータス」を保存するために「itertools.tee」を複製することができますか?

StackOverflow https://stackoverflow.com/questions/3957270

質問

以下はいくつかのテストです itertools.tee:

    li = [x for x in range(10)]
    ite = iter(li)
==================================================
    it = itertools.tee(ite, 5)
    >>> type(ite)
    <type 'listiterator'>
    >>> type(it)
    <type 'tuple'>
    >>> type(it[0])
    <type 'itertools.tee'>
    >>> 

    >>> list(ite)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(it[0])          # here I got nothing after 'list(ite)', why?
    []
    >>> list(it[1])
    []
====================play again===================
    >>> ite = iter(li)
    it = itertools.tee(ite, 5)
    >>> list(it[1])
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(it[2])
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(it[3])
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(it[4])
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(ite)
    []                       # why I got nothing? and why below line still have the data?   
    >>> list(it[0])
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(it[0])
    []
====================play again===================    
    >>> ite = iter(li)
    itt = itertools.tee(it[0], 5)    # tee the iter's tee[0].
    >>> list(itt[0])
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(itt[1])
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(it[0])
    []                               # why this has no data?
    >>> list(it[1])
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(ite)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  

私の質問はです

  1. TEEはどのように機能し、なぜ元のIterに「データがある」のか、そして他の時間はそうではありませんか?
  2. Iterの深いコピーを「ステータスシード」として保持して、生のイテレータステータスを保持し、後で使用するために使用することはできますか?
  3. 2つまたは2つを交換できますか? itertools.tee?

ありがとう!

役に立ちましたか?

解決

tee 元のイテレーターを引き継ぎます。イテレーターをティーしたら、ティーが所有しているので、元のイテレーターを捨てます(自分が何をしているのか本当にわからない限り)。

あなたはティーのコピーをで作ることができます copy モジュール:

import copy, itertools
it = [1,2,3,4]
a, b = itertools.tee(it)
c = copy.copy(a)

...または電話することによって a.__copy__().

それに注意してください tee 元のイテレーターから消費されたすべての反復値を追跡することで機能しますが、これはまだコピーで消費される可能性があります。

例えば、

a = [1,2,3,4]
b, c = itertools.tee(a)
next(b)

この時点で、ティーオブジェクトの根底にあります bc 1つの値を読みました、 1. 。それはメモリに保存しています。 c 繰り返されます。ティーのすべてのコピーによって消費されるまで、すべての価値をメモリに保つ必要があります。

この結果、ティーをコピーすることで「節約状態」に注意する必要があるということです。 「保存された状態」ティーから実際に値を消費しない場合、ティーに保持することになります すべての値 メモリのイテレーターによって永遠に返されます(コピーされたティーが破棄されて収集されるまで)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top