groupby()
の操作は Unix の uniq
フィルターと似ています。
key 関数の値が変わるたびに休止または 新しいグループを生成します (このために通常 同じ key 関数でソートしておく必要があるのです)。
この動作は SQL の入力順に関係なく共通の要素を集約する GROUP BY とは違います。
# -*- coding:utf-8 -*-
from itertools import groupby
from operator import itemgetter
data = [("a", 1), ("b", 1), ("a", 2), ("b", 2), ("c", 1)]
print("data: %s" % data)
# データをソートしておく
data_sorted = sorted(data, key=itemgetter(0))
print("sorted data: %s" % data_sorted)
groups = []
groups_key_merged = []
for unique_key, group in groupby(data_sorted, key=itemgetter(0)):
groups.append(list(group)) # Store group iterator as a list
print("grouped data: %s" % groups)
data: [('a', 1), ('b', 1), ('a', 2), ('b', 2), ('c', 1)]
sorted data: [('a', 1), ('a', 2), ('b', 1), ('b', 2), ('c', 1)]
grouped data: [[('a', 1), ('a', 2)], [('b', 1), ('b', 2)], [('c', 1)]]
参考
https://docs.python.jp/3/library/itertools.html#itertools.groupby
https://qiita.com/tag1216/items/9aecc6816371ee35215e