【问题标题】:Group by multiple keys and summarize/average multiple values of a list of dictionaries按多个键分组并汇总/平均字典列表的多个值
【发布时间】:2017-03-04 02:30:44
【问题描述】:

我是 Python 新手,在使用以下代码时遇到了问题。

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

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

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

在 for 循环中放置 temp_dict["vol"] = sum(item["vol"] for item in grp) 不会产生所需的结果,这最终是我的问题。

如何在将另一个字段及其计算值添加(附加)到列表中时保留键、在代码中看到的分组?

提前感谢您的帮助。

【问题讨论】:

  • 期望的结果是什么?您能否说明您想要实现的目标?
  • 我将尝试澄清 - 期望的结果是循环输入,根据提供的键进行分组,并根据键分组总结每个字段(例如 qty 和 vol)。最终,我想将所有汇总的详细信息附加到每个关键分组中。

标签: python dictionary


【解决方案1】:

如果您想多次迭代,您需要“复制”grpitertools.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 完美。我自己现在才学习 itertools。你可以用它们做的一些事情非常整洁,不是吗?
  • 同意 - itertools 非常有用。我对 Python 了解得越多,我就越希望在职业生涯的早期就开始使用它进行编码。再次感谢保罗的帮助。
猜你喜欢
  • 2014-03-07
  • 2021-05-11
  • 2021-09-27
相关资源
最近更新 更多