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

时间:2017-03-04 02:30:45

标签: python dictionary

我是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)不会产生预期的结果,这最终是我的问题。

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

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果您想多次迭代grp,则需要“复制”itertools.teefor 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) 可以为您执行此操作

{{1}}