itertools.groupby()
を使ってリストを分割するのはかなり簡単です。なぜ `zip`は` groupby` iterableを消費するようですか?
>>> import itertools as it
>>> iterable = it.groupby([1, 2, 3, 4, 5, 2, 3, 4, 2], lambda p: p==2)
>>> for x, y in iterable:
... print(x, list(y))
... next(iterable)
False [1]
False [3, 4, 5]
False [3, 4]
期待どおりに動作します。しかし、一般的なPythonのイディオムzip
を使ってイテレータを複数回実行すると、一度に2つずつステップを踏みだすように見えます。 print(y)
を追加
>>> iterable = it.groupby([1, 2, 3, 4, 5, 2, 3, 4, 2], lambda p: p==2)
>>> for (x, y), _ in zip(iterable, iterable):
... print(x, list(y))
False []
False []
False []
は期待ネストされた反復可能な<itertools._grouper object at 0xXXXXXXXX>
を示しているが、私は明らかにgrouper
オブジェクトが空である理由として、何かが欠けています。誰か光を当てることはできますか?
私は不均一なリストを持っているとitertools.zip_longest
を使用している場合、私も奇妙な結果を得る:
>>> iterable = it.groupby([1, 2, 3, 4, 5, 2, 3, 4], lambda p: p==2)
>>> for (x, y), _ in it.zip_longest(iterable, iterable, fillvalue=None):
... print(x, list(y))
False []
False []
False [4]
更新:簡単な修正はitertools.islice()
を使用することです:
>>> iterable = it.groupby([1, 2, 3, 4, 5, 2, 3, 4, 2], lambda p: p==2)
>>> for x, y in it.islice(iterable, None, None, 2):
... print(x, list(y))
False [1]
False [3, 4, 5]
False [3, 4]
[itertools.groupbyの予期しない動作](http://stackoverflow.com/questions/35991852/unexpected-behavior-of-itertools-groupby) – vaultah