【问题标题】:How do I format a list of dictionaries with itertools.groupby?如何使用 itertools.groupby 格式化字典列表?
【发布时间】:2016-08-02 04:14:24
【问题描述】:

试图找到将 dicts 列表格式化为特定 json 格式的最佳方式。目前我正在手动循环遍历字典数组。

我的数组:

a = [{'sales': 2100, 'department_id': 66, 'department_name': 'dog', 'month':11},
     {'sales': 3900, 'department_id': 22, 'department_name': 'cat', 'month':12},
     {'sales': 2100, 'department_id': 66, 'department_name': 'cat','month':11},
     {'sales': 3900, 'department_id': 22, 'department_name': 'dog','month':12}]

预期结果:

b = [{"result":[{"month":11, 'sales': 2100},
                {"month":12, 'sales': 3900},]
      "meta":{"name":"cat"}
      "department_id": 22
     },
     {"result":[{"month":11, 'sales': 2100},
                {"month":12, 'sales': 3900},]
      "meta":{"name":"dog"}
      "department_id": 66
     }]

虽然可以通过groupby 进行排序,但我宁愿不再使用它来获取名称元数据。是否有另一个高效的 dict group bys 库?

【问题讨论】:

  • 当您使用itertools.groupby 对字典进行分组时,为什么您认为无法获得name?
  • @ozgur 因为您可以对一个属性进行分组,并且必须对每个组进行递归才能再次获得结果。还是我错过了什么?

标签: python json dictionary python-3.5


【解决方案1】:

如果你只想按department_id分组,你可以使用另一个dict进行分组,使用defaultdict按id分组并根据需要构造新的k/v对,没有必要对数据进行排序:

a = [{'sales': 2100, 'department_id': 66, 'department_name': 'dog', 'month': 11},
     {'sales': 3900, 'department_id': 22, 'department_name': 'cat', 'month': 12},
     {'sales': 2100, 'department_id': 66, 'department_name': 'cat', 'month': 11},
     {'sales': 3900, 'department_id': 22, 'department_name': 'dog', 'month': 12}]

from collections import defaultdict

dct = defaultdict(lambda: {"result": [], "meta": "", "department_id": ""})

for d in a:
    _id = d['department_id']
    dct[_id]["result"].append({"sales": d["sales"], "month": d["month"]})
    dct[_id]["meta"] = d['department_name']
    dct[_id]["department_id"] = _id

from pprint import pprint as pp
pp(dct.values())

这会给你:

[{'department_id': 66,
  'meta': 'cat',
  'result': [{'month': 11, 'sales': 2100}, {'month': 11, 'sales': 2100}]},
 {'department_id': 22,
  'meta': 'dog',
  'result': [{'month': 12, 'sales': 3900}, {'month': 12, 'sales': 3900}]}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 2018-03-07
    • 1970-01-01
    • 2020-11-16
    • 2022-11-13
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多