プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2022/01/19

[Python] groupby の使い方

event_note2022/01/19 3:34

C# の Linq にある GroupBy と同じことを Python でやるにはどうしたらいいのかと思い調べたら、itertools モジュールに groupby というクラスがありました。

サンプル

import json
from itertools import groupby
 
# サンプルデータ
members = [
    {'country': 'Japan', 'sex': 'male', 'name': 'A'},
    {'country': 'America', 'sex': 'female', 'name': 'B'},
    {'country': 'China', 'sex': 'male', 'name': 'C'},
    {'country': 'Japan', 'sex': 'female', 'name': 'D'},
    {'country': 'America', 'sex': 'male', 'name': 'E'},
    {'country': 'China', 'sex': 'female', 'name': 'F'},
]
 
# groupby を使うには、まずはグルーピングしたいキーでソートしておく必要がある
members.sort(key=lambda m: m['country'])
# ソートした上で、キーを指定してグループ化
grouped = groupby(members, key=lambda x: x['country'])

# グループ化した内容を表示して確認
grouped_list = []
for key, group in grouped:
    member_list = list(group) # group はイテレーターなので、リストに変換
    grouped_list.append({
        'key': key,
        'members': member_list
    })
print(json.dumps(grouped_list, indent=4))
[
    {
        "key": "America",
        "members": [
            {
                "country": "America",
                "sex": "female",
                "name": "B"
            },
            {
                "country": "America",
                "sex": "male",
                "name": "E"
            }
        ]
    },
    {
        "key": "China",
        "members": [
            {
                "country": "China",
                "sex": "male",
                "name": "C"
            },
            {
                "country": "China",
                "sex": "female",
                "name": "F"
            }
        ]
    },
    {
        "key": "Japan",
        "members": [
            {
                "country": "Japan",
                "sex": "male",
                "name": "A"
            },
            {
                "country": "Japan",
                "sex": "female",
                "name": "D"
            }
        ]
    }
]