Python標準ライブラリのモジュール itertools はイテレータを扱う便利な関数が提供されています。
その中でも groupby はよく使う機会が多いのですが、以外と知らない人も多いようなので紹介します。
groupby
iterable(リストやイテレータなど)を任意のキーでグルーピングする関数です。
戻り値はキーとキーに属する要素のイテレータになります。
groupbyに渡すiterableは同じキーの要素が連続していなければならないので、事前にソートする必要があります。
基本的な使い方
説明だけだとイメージがつきにくいので簡単なサンプルを見てみましょう。
文字と数値のタプルを要素とするリストを、文字でグルーピングする例です。
from itertools import groupby
from operator import itemgetter
a = [("b", 3), ("a", 1), ("c", 2), ("a", 2), ("b", 1)]
a = sorted(a, key=itemgetter(0))
for (k, g) in groupby(a, key=itemgetter(0)):
print("key:" + k)
for item in g:
print(item)
実行結果
key:a
('a', 1)
('a', 2)
key:b
('b', 3)
('b', 1)
key:c
('c', 2)
ソートしないでgroupbyを使うと次のようになってしまいます。
ソートしないで実行すると...
key:b
('b', 3)
key:a
('a', 1)
key:c
('c', 2)
key:a
('a', 2)
key:b
('b', 1)