为了账号安全,请及时绑定邮箱和手机立即绑定

字典列表的聚合

字典列表的聚合

智慧大石 2021-11-23 19:45:11
我正在尝试对我在我正在处理的 django 应用程序中找到的这些数据进行排序和聚合。问题是我迷失了遍历列表和存储数据的最佳方式。这是我所拥有的一个例子:from score.models import LocDataq = [        {'ref': '002', 'loc': 'seattle', 'total': '200'},         {'ref': '002', 'loc': 'seattle', 'total': '100'},         {'ref': '123', 'loc': 'dallas', 'total': '100'},         {'ref': '452', 'loc': 'cleveland', 'total': '600'},         {'ref': '123', 'loc': 'dallas', 'total': '200'},         {'ref': '002', 'loc': 'seattle', 'total': '300'}        ]我想最终得到的是下面的列表,它由 ref 字段聚合并使用 loc 维护此字段,但添加了 total 字段。这是所需的输出。q = [        {'ref': '002', 'loc': 'seattle', 'total': '600'},         {'ref': '123', 'loc': 'dallas', 'total': '300'},         {'ref': '452', 'loc': 'cleveland', 'total': '600'},         ]有人能告诉我我有哪些工具可以做到这一点吗?提前致谢!
查看完整描述

2 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

可以先构造一个中间字典,然后根据所需的输出对其进行转换:


from collections import defaultdict


q = [

        {'ref': '002', 'loc': 'seattle', 'total': '200'}, 

        {'ref': '002', 'loc': 'seattle', 'total': '100'}, 

        {'ref': '123', 'loc': 'dallas', 'total': '100'}, 

        {'ref': '452', 'loc': 'cleveland', 'total': '600'}, 

        {'ref': '123', 'loc': 'dallas', 'total': '200'}, 

        {'ref': '002', 'loc': 'seattle', 'total': '300'}

    ]


temp_dict = defaultdict(int)


for entry in q:

    temp_dict[(entry['ref'], entry['loc'])] += int(entry['total'])


result = [{'ref': k[0], 'loc': k[1], 'total': str(v)} for k, v in temp_dict.items()]

print(result)


# [{'ref': '002', 'loc': 'seattle', 'total': '600'},

#  {'ref': '123', 'loc': 'dallas', 'total': '300'},

#  {'ref': '452', 'loc': 'cleveland', 'total': '600'}]


查看完整回答
反对 回复 2021-11-23
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

您可以使用一个聚合collections.Counter:


from collections import Counter

from pprint import pprint


q = [

    {"ref": "002", "loc": "seattle", "total": "200"},

    {"ref": "002", "loc": "seattle", "total": "100"},

    {"ref": "123", "loc": "dallas", "total": "100"},

    {"ref": "452", "loc": "cleveland", "total": "600"},

    {"ref": "123", "loc": "dallas", "total": "200"},

    {"ref": "002", "loc": "seattle", "total": "300"},

]


counts = Counter()

for x in q:

    ref, loc, total = x["ref"], x["loc"], x["total"]

    counts[ref, loc] += int(total)


pprint(

    [

        {"ref": ref, "loc": loc, "total": str(total)}

        for (ref, loc), total in counts.items()

    ]

)

#[{'loc': 'seattle', 'ref': '002', 'total': '600'},

# {'loc': 'dallas', 'ref': '123', 'total': '300'},

# {'loc': 'cleveland', 'ref': '452', 'total': '600'}]


查看完整回答
反对 回复 2021-11-23
  • 2 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信