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"
}
]
}
]