2016-12-20 7 views

答えて

6

いいえ、リストへの呼び出しが消費しません。listはまだ一つの要素を保持し、最後の1から離れて、ネストされた発電機の大半を消費しているようですネストされたイテレータ/ジェネレータ。

挙動はitertools.groupbyに特有であり、ドキュメントに記載されている:

返さ基はgroupby()と共有根底 反復可能なそのイテレータそのものです。ソースが共有されているため、 groupby()オブジェクトがアドバンスされた場合、以前のグループは表示されなくなりました

[強調鉱山]

あなたはドキュメントで提供itertools.groupbyのPythonソースと同等に表情を与える場合、これはより多くの説明次のようになります。ショー

class groupby(object): 
    def __init__(self, iterable, key=None): 
     if key is None: 
      key = lambda x: x 
     self.keyfunc = key 

     self.it = iter(iterable) # shared iterator 

     self.tgtkey = self.currkey = self.currvalue = object() 

    def __iter__(self): 
     return self 

    def next(self): 
     while self.currkey == self.tgtkey: 
      self.currvalue = next(self.it) # Exit on StopIteration 
      self.currkey = self.keyfunc(self.currvalue) 
     self.tgtkey = self.currkey 
     return (self.currkey, self._grouper(self.tgtkey)) 

    def _grouper(self, tgtkey): 
     while self.currkey == tgtkey: 
      yield self.currvalue 
      self.currvalue = next(self.it) # Exit on StopIteration 
      self.currkey = self.keyfunc(self.currvalue) 

最後[3]あなたの結果のself.currvalue_grouperによって得られたもの)は、groupbyオブジェクトの前回の呼び出しからすでに割り当てられています。

各グループの結果を保持するには、それらをリストに保存し、groupbyオブジェクトを一度にすべて消費する必要はありません。

+1

徹底的な回答ありがとうございました!私はドキュメントをもっと慎重にチェックすべきでした:-) –

関連する問題