このような表形式のデータを、 group_id
ごとに name
でまとめたい場合です。
group_id | name |
---|---|
monogatari | 化物語 |
monogatari | 傷物語 |
monogatari | 偽物語 |
monogatari | 猫物語 |
monogatari | 傾物語 |
monogatari | 花物語 |
monogatari | 囮物語 |
monogatari | 鬼物語 |
monogatari | 恋物語 |
monogatari | 憑物語 |
monogatari | 暦物語 |
monogatari | 終物語 |
monogatari | 続・終物語 |
toaru | とある魔術の禁書目録 |
toaru | 新約 とある魔術の禁書目録 |
toaru | とある魔術の禁書目録SP |
toaru | とある科学の超電磁砲 |
toaru | とある科学の超電磁砲 アストラル・バディ |
itertools
の groupby
と、operator
の itemgetter
を利用すれば1行で実現できます。
from itertools import groupby
from operator import itemgetter
items = [
{'group_id': 'monogatari', 'name': '化物語'},
{'group_id': 'monogatari', 'name': '傷物語'},
{'group_id': 'monogatari', 'name': '偽物語'},
{'group_id': 'monogatari', 'name': '猫物語'},
{'group_id': 'monogatari', 'name': '傾物語'},
{'group_id': 'monogatari', 'name': '花物語'},
{'group_id': 'monogatari', 'name': '囮物語'},
{'group_id': 'monogatari', 'name': '鬼物語'},
{'group_id': 'monogatari', 'name': '恋物語'},
{'group_id': 'monogatari', 'name': '憑物語'},
{'group_id': 'monogatari', 'name': '暦物語'},
{'group_id': 'monogatari', 'name': '終物語'},
{'group_id': 'monogatari', 'name': '続・終物語'},
{'group_id': 'toaru', 'name': 'とある魔術の禁書目録'},
{'group_id': 'toaru', 'name': '新約 とある魔術の禁書目録'},
{'group_id': 'toaru', 'name': 'とある魔術の禁書目録SP'},
{'group_id': 'toaru', 'name': 'とある科学の超電磁砲'},
{'group_id': 'toaru', 'name': 'とある科学の超電磁砲 アストラル・バディ'},
]
lists = {g: [x['name'] for x in list(n)] for (g, n) in groupby(items, key=itemgetter('group_id'))}
lists
には以下のようにデータが入ります。
{
"monogatari": [
"化物語",
"傷物語",
"偽物語",
"猫物語",
"傾物語",
"花物語",
"囮物語",
"鬼物語",
"恋物語",
"憑物語",
"暦物語",
"終物語",
"続・終物語"
],
"toaru": [
"とある魔術の禁書目録",
"新約 とある魔術の禁書目録",
"とある魔術の禁書目録SP",
"とある科学の超電磁砲",
"とある科学の超電磁砲 アストラル・バディ"
]
}
注意点としては、 items
はグループ化に使うキー(ここでは group_id
)でソートされている必要があります。