0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Python3 : dict配列をとあるキーでグループ化する

Last updated at Posted at 2019-02-23

このような表形式のデータを、 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 とある科学の超電磁砲 アストラル・バディ

itertoolsgroupby と、operatoritemgetter を利用すれば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 )でソートされている必要があります。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?