1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

itertools.groupby ご利用上の注意

Posted at

イテレーション中でグループを参照すること

https://docs.python.org/ja/3/library/itertools.html#itertools.groupby より

返されるグループはそれ自体がイテレータで、 groupby() と iterable を共有しています。もととなる iterable を共有しているため、 groupby() オブジェクトの要素取り出しを先に進めると、それ以前の要素であるグループは見えなくなってしまいます。

良い例:

>>> import itertools
>>> groups = []
>>> for _, g in itertools.groupby([1, 1, 2, 2, 3, 3]):
...     groups.append(list(g))
...
>>> for g in groups:
...     print(g)
...
[1, 1]
[2, 2]
[3, 3]

悪い例:

>>> import itertools
>>> groups = []
>>> for _, g in itertools.groupby([1, 1, 2, 2, 3, 3]):
...     groups.append(g)
...
>>> for g in groups:
...     print(list(g))
...
[]
[]
[]

事前にソート済みであること

https://docs.python.org/ja/3/library/itertools.html#itertools.groupby より

通常、iterable は同じキー関数でソート済みである必要があります。

ソート済みでないと使えないというわけではないが、例えば以下のどちらを期待してるかによって、必要なら事前にソートしてから groupby を呼ぶ。

事前にソートしない例:

>>> import itertools
>>> groups = []
>>> for _, g in itertools.groupby([1, 1, 2, 2, 3, 3, 2, 1]):
...     groups.append(list(g))
...
>>> groups
[[1, 1], [2, 2], [3, 3], [2], [1]]

事前にソートする例:

>>> import itertools
>>> groups = []
>>> for _, g in itertools.groupby(sorted([1, 1, 2, 2, 3, 3, 2, 1])):
...     groups.append(list(g))
...
>>> groups
[[1, 1, 1], [2, 2, 2], [3, 3]]

確認環境

Python 3.7.2 で動作確認しました。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?