概要
pythonの組み込み関数であるgroupby()は、リストやイテレータオブジェクトを指定のキーでグループ化することができる非常に便利な関数です。
同じグループに属する要素を一括して取り扱う場合に特に有用です。
詳細内容
groupby()関数は、ひとつのリストやイテレーターオブジェクトを指定のキーでグループ化する関数です。
指定されたキーが同じ要素が一括して扱われるので、同じグループに属する要素をまとめて扱うときに非常に便利です。
例えば、以下のようなリストがあるとします。
words = ['apple', 'ant', 'banana', 'bat', 'cat', 'can']
これをアルファベットの頭文字でグループ化する場合、以下のようにします。
python
from itertools import groupbywords = ['apple', 'ant', 'banana', 'bat', 'cat', 'can']
groups = groupby(words, key=lambda x: x[0])for key, group in groups:
print(key, list(group))
実行すると、以下のように表示されます。
a ['apple', 'ant']
b ['banana', 'bat']
c ['cat', 'can']
ここで、groupby()関数に与えたkey引数のlambda関数は、各単語の最初の文字を取り出して返す関数です。
この関数で取得した最初の文字でグループ化され、同じ最初の文字を持つ単語がまとめられます。
groupby()関数が返す値は、キーとグループのイテレーターオブジェクトからなるタプルです。
上記の例では、キーが’a’, ‘b’, ‘c’の3つのグループが返され、各グループにはそのキーと対応する単語のリストが含まれます。
groupby()関数は、リストだけでなく、イテレーターオブジェクトに対しても使用できます。
そして、イテレーターオブジェクトに対して使用すると、より効率的にメモリを使用することができます。
ただし、イテレーターオブジェクトには順序があるため、グループ化する前に必ずソートしておく必要があります。
例えば、以下のような辞書オブジェクトがあるとします。
python
items = [{'name': 'apple', 'category': 'fruit', 'price': 100},
{'name': 'banana', 'category': 'fruit', 'price': 150},
{'name': 'carrot', 'category': 'vegetable', 'price': 80},
{'name': 'donut', 'category': 'snack', 'price': 200},
{'name': 'eggplant', 'category': 'vegetable', 'price': 120}]
この場合、’category’キーでグループ化したいときは、以下のようにします。
python
from operator import itemgetter
from itertools import groupbyitems = [{'name': 'apple', 'category': 'fruit', 'price': 100},
{'name': 'banana', 'category': 'fruit', 'price': 150},
{'name': 'carrot', 'category': 'vegetable', 'price': 80},
{'name': 'donut', 'category': 'snack', 'price': 200},
{'name': 'eggplant', 'category': 'vegetable', 'price': 120}]items_sorted = sorted(items, key=itemgetter('category'))
groups = groupby(items_sorted, key=itemgetter('category'))for key, group in groups:
print(key, list(group))
実行すると、以下のように表示されます。
fruit [{'name': 'apple', 'category': 'fruit', 'price': 100}, {'name': 'banana', 'category': 'fruit', 'price': 150}]
vegetable [{'name': 'carrot', 'category': 'vegetable', 'price': 80}, {'name': 'eggplant', 'category': 'vegetable', 'price': 120}]
snack [{'name': 'donut', 'category': 'snack', 'price': 200}]
この場合、itemgetter()関数で’category’キーを指定してソートしています。
そして、グループ化するときにも同じキーを指定しています。
なお、groupby()関数は、単純に指定のキーでグループ化するだけであり、グループ内の要素の並び順は変更されません。
以前の例ではグループ化されたリストを表示しましたが、それらはグループ内の要素の並び順を反映していないため、違った並び順で表示される可能性があります。
以上のように、groupby()関数を利用することで、リストやイテレーターオブジェクトを指定のキーでグループ化することができ、同じグループに属する要素をまとめて扱うことができます。
コメント