按多个键分组,汇总/平均多个字典列表的值

问题描述:

我是Python新手,遇到以下代码存在的问题。按多个键分组,汇总/平均多个字典列表的值

我正在寻找一种方法,可以通过多个键进行分组,并在Python中汇总/平均字典列表的值。下面的代码(也位于上一个问题/响应位于:Group by multiple keys and summarize/average values of a list of dictionaries)让我走上正轨,但我遇到了在循环中添加更多字段聚合的问题。

说我有一个字典列表如下所示:内的temp_dict["vol"] = sum(item["vol"] for item in grp)

{'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}] 

放置:

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) 

预期结果是for循环不会产生所需的结果,这最终是我的问题。

如何在代码中看到保持键,分组时添加(追加)另一个字段及其计算值到列表中?

在此先感谢您的帮助。

+1

什么是理想的效果?你能否澄清你想达到的目标? –

+0

我会尝试澄清 - 期望的结果将循环通过输入,基于提供的密钥组,并基于密钥分组汇总每个字段(如qty和vol)。最终,我希望将所有摘要详细信息附加到每个关键分组。 –

你需要“复制” 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) 
+0

保罗 - 感谢您指引我走向正确的方向。我接受了你提供的内容,对tee()进行了更多的研究,并提出了适合我的项目的下面的代码。谢谢 - 我已经接受了你的答案。新代码 - grp1,grp2,grp3,grp4 = tee(grp,4) –

+0

@ J.Ester Perfect。我自己现在只是在学习itertools。你可以用它们做的一些事情非常整齐,不是吗? –

+0

同意 - itertools是非常有用的。我对Python的了解越多,我希望自己在职业生涯早期就开始编码。再次感谢Paul的帮助。 –