Python
の標準ライブラリの関数「 groupby
」を利用したリストのグループ化の方法を説明していきます。
前提条件
今回サンプルを実行した環境は下記の通りです。
- Python : 3.6.1
グループ化の構文
グループ化の構文は下記の通りです。
from itertools import groupby
groupby(list, key=lambda x: x['key'])
「 list
」はリストや配列など、x['key']の「 key
」を適宜読み替えて利用します。
では実際に使ってみます。
グループ化の実装方法
from itertools import groupby
# 名前と成績のランクの一覧
# {'name': 名前, 'rank': 成績}
members = [{'name': '佐藤', 'rank': 'A'},
{'name': '鈴木', 'rank': 'B'},
{'name': '田中', 'rank': 'A'},
{'name': '山田', 'rank': 'C'},
{'name': '山本', 'rank': 'B'}]
# groupbyを使うには、まずはグルーピングしたいキーでソートする
members.sort(key=lambda x: x['rank'])
# 成績でグルーピング
for key, ranking in groupby(members, key=lambda x: x['rank']):
print("key:", key)
for rank in ranking:
print(rank)
動作確認
先ほどのソースの動作確認すると、
$ python sample.py
key: A
{'name': '佐藤', 'rank': 'A'}
{'name': '田中', 'rank': 'A'}
key: B
{'name': '鈴木', 'rank': 'B'}
{'name': '山本', 'rank': 'B'}
key: C
{'name': '山田', 'rank': 'C'}
という感じでグループ化されます。
最後に
標準ライブラリを利用することでグループ化のロジックを実装せずに、グループ化を実現することができました。もし、「 groupby
」を使用しない場合、リストを for
文でループしてグルーピング対象のキー値を判別して、配列に詰め直して、っていうのを自分で実装ないといけなくなるので、それに比べるとかなり簡単にグループ化の実装ができると思います。
コメント