按多个键分组并对字典列表中的多个值进行汇总/平均

3

我是新手Python开发者,遇到了以下代码问题。

我想要在Python中按多个键分组,并汇总/平均一个字典列表的值。以下代码(也可以在此处找到前一个问题/响应的位置:按多个键分组并汇总/平均字典列表的值)为我指明了正确的方向,但我在循环中添加更多字段聚合时遇到了问题。

假设我有一个如下所示的字典列表:

input = [
{'msn': '001', 'source': 'foo', 'status': '1', 'qty': 100, 'vol': 100},
{'msn': '001', 'source': 'bar', 'status': '2', 'qty': 200, 'vol': 200},
{'msn': '001', 'source': 'foo', 'status': '1', 'qty': 300, 'vol': 300},
{'msn': '002', 'source': 'baz', 'status': '2', 'qty': 400, 'vol': 100},
{'msn': '002', 'source': 'baz', 'status': '1', 'qty': 500, 'vol': 400},
{'msn': '002', 'source': 'qux', 'status': '1', 'qty': 600, 'vol': 100},
{'msn': '003', 'source': 'foo', 'status': '2', 'qty': 700, 'vol': 200}]

我的代码如下:

for key, grp in groupby(sorted(dict_list, key = grouper), grouper):
    temp_dict = dict(zip(["msn", "source"], key))
    temp_dict["qty"] = sum(item["qty"] for item in grp)
    temp_dict["vol"] = sum(item["vol"] for item in grp)
    result.append(temp_dict)

期望的结果是:

{'msn': '001', 'source': 'foo', 'qty': 400, 'vol': 400},
{'msn': '001', 'source': 'bar', 'qty': 200, 'vol': 200},
{'msn': '002', 'source': 'baz', 'qty': 200, 'vol': 500},
{'msn': '003', 'source': 'foo', 'qty': 900, 'vol': 200}]

temp_dict["vol"] = sum(item["vol"] for item in grp)在for循环中的放置位置无法产生期望的结果,这是我的问题所在。

我要如何在保留代码中的键和分组的同时向列表添加(附加)另一个字段及其计算出的值?

感谢您提前提供任何帮助。


1
你想要什么样的结果?你能否澄清一下你想要实现什么? - Hesham Attia
我会尝试澄清 - 所期望的结果是循环遍历输入,基于提供的键进行分组,并根据键分组汇总每个字段(例如数量和体积)。最终,我希望将所有汇总的详细信息附加到每个键分组中。 - J.Ester
1个回答

1
如果您想多次迭代 grp,则需要“复制”它,itertools.tee 可以帮助您完成这一点。
for key, grp in groupby(sorted(dict_list, key = grouper), grouper):
    temp_dict = dict(zip(["msn", "source"], key))
    grp1, grp2 = tee(grp)
    temp_dict["qty"] = sum(item["qty"] for item in grp1)
    temp_dict["vol"] = sum(item["vol"] for item in grp2)
    result.append(temp_dict)

Paul - 感谢您指引我正确的方向。我使用了您提供的内容,并对tee()进行了更多的研究,最终编写出了适合我的项目的下面代码。谢谢 - 我已经接受了您的答案。新代码 - grp1、grp2、grp3、grp4 = tee(grp,4)。 - J.Ester
@J.Ester 太好了。我现在自己也正在学习itertools。你可以用它们做一些很聪明的事情,是吗? - Paul Panzer
同意 - itertools非常有用。我越了解Python,就越希望我在职业生涯早期就开始编码。再次感谢Paul的帮助。 - J.Ester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接