いいえ、リストへの呼び出しが消費しません。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
オブジェクトを一度にすべて消費する必要はありません。
徹底的な回答ありがとうございました!私はドキュメントをもっと慎重にチェックすべきでした:-) –