如何使用Python按多个键对字典列表进行分组并计算各组的平均值?

2026-06-11 05:161阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计650个文字,预计阅读时间需要3分钟。

如何使用Python按多个键对字典列表进行分组并计算各组的平均值?

通过多个键值对进行分组并计算字典列表的平均值,最Pythonic的方法是使用`collections.defaultdict`来分组,然后对每个分组计算平均值。以下是具体实现:

pythonfrom collections import defaultdict

input=[ {'dept': '001', 'sku': 'foo', 'transId': 'uniqueId1', 'qty': 100}, {'dept': '001', 'sku': 'foo', 'transId': 'uniqueId2', 'qty': 150}, {'dept': '002', 'sku': 'bar', 'transId': 'uniqueId3', 'qty': 200}, {'dept': '002', 'sku': 'bar', 'transId': 'uniqueId4', 'qty': 250},]

使用defaultdict按dept分组grouped=defaultdict(list)for item in input: grouped[item['dept']].append(item['qty'])

计算每个分组的平均值averages={dept: sum(qties) / len(qties) for dept, qties in grouped.items()}

averages

输出结果将是一个字典,包含每个部门及其对应字典列表的平均值。

什么是通过多个键进行分组的最 pythonic方法,并在 Python中汇总字典列表的平均值?假设我有一个字典列表如下:

如何使用Python按多个键对字典列表进行分组并计算各组的平均值?

input = [ {'dept': '001', 'sku': 'foo', 'transId': 'uniqueId1', 'qty': 100}, {'dept': '001', 'sku': 'bar', 'transId': 'uniqueId2', 'qty': 200}, {'dept': '001', 'sku': 'foo', 'transId': 'uniqueId3', 'qty': 300}, {'dept': '002', 'sku': 'baz', 'transId': 'uniqueId4', 'qty': 400}, {'dept': '002', 'sku': 'baz', 'transId': 'uniqueId5', 'qty': 500}, {'dept': '002', 'sku': 'qux', 'transId': 'uniqueId6', 'qty': 600}, {'dept': '003', 'sku': 'foo', 'transId': 'uniqueId7', 'qty': 700} ]

期望的聚合输出:

output=[ {'dept': '001', 'sku': 'foo', 'qty': 400}, {'dept': '001', 'sku': 'bar', 'qty': 200}, {'dept': '002', 'sku': 'baz', 'qty': 900}, {'dept': '002', 'sku': 'qux', 'qty': 600}, {'dept': '003', 'sku': 'foo', 'qty': 700} ]

或平均:

output=[ {'dept': '001', 'sku': 'foo', 'avg': 200}, {'dept': '001', 'sku': 'bar', 'avg': 200}, {'dept': '002', 'sku': 'baz', 'avg': 450}, {'dept': '002', 'sku': 'qux', 'avg': 600}, {'dept': '003', 'sku': 'foo', 'avg': 700} ]

我发现了这个:Group by and aggregate the values of a list of dictionaries in Python但它似乎没有给我我想要的东西.

获得汇总结果

from itertools import groupby from operator import itemgetter grouper = itemgetter("dept", "sku") result = [] for key, grp in groupby(sorted(input_data, key = grouper), grouper): temp_dict = dict(zip(["dept", "sku"], key)) temp_dict["qty"] = sum(item["qty"] for item in grp) result.append(temp_dict) from pprint import pprint pprint(result)

产量

[{'dept': '001', 'qty': 200, 'sku': 'bar'}, {'dept': '001', 'qty': 400, 'sku': 'foo'}, {'dept': '002', 'qty': 900, 'sku': 'baz'}, {'dept': '002', 'qty': 600, 'sku': 'qux'}, {'dept': '003', 'qty': 700, 'sku': 'foo'}]

要获得平均值,您可以简单地更改for循环内的内容,就像这样

temp_dict = dict(zip(["dept", "sku"], key)) temp_list = [item["qty"] for item in grp] temp_dict["avg"] = sum(temp_list) / len(temp_list) result.append(temp_dict)

产量

[{'avg': 200, 'dept': '001', 'sku': 'bar'}, {'avg': 200, 'dept': '001', 'sku': 'foo'}, {'avg': 450, 'dept': '002', 'sku': 'baz'}, {'avg': 600, 'dept': '002', 'sku': 'qux'}, {'avg': 700, 'dept': '003', 'sku': 'foo'}]

建议:无论如何,我会在这样的dict中添加qty和avg

temp_dict = dict(zip(["dept", "sku"], key)) temp_list = [item["qty"] for item in grp] temp_dict["qty"] = sum(temp_list) temp_dict["avg"] = temp_dict["qty"] / len(temp_list) result.append(temp_dict)

产量

[{'avg': 200, 'dept': '001', 'qty': 200, 'sku': 'bar'}, {'avg': 200, 'dept': '001', 'qty': 400, 'sku': 'foo'}, {'avg': 450, 'dept': '002', 'qty': 900, 'sku': 'baz'}, {'avg': 600, 'dept': '002', 'qty': 600, 'sku': 'qux'}, {'avg': 700, 'dept': '003', 'qty': 700, 'sku': 'foo'}]

本文共计650个文字,预计阅读时间需要3分钟。

如何使用Python按多个键对字典列表进行分组并计算各组的平均值?

通过多个键值对进行分组并计算字典列表的平均值,最Pythonic的方法是使用`collections.defaultdict`来分组,然后对每个分组计算平均值。以下是具体实现:

pythonfrom collections import defaultdict

input=[ {'dept': '001', 'sku': 'foo', 'transId': 'uniqueId1', 'qty': 100}, {'dept': '001', 'sku': 'foo', 'transId': 'uniqueId2', 'qty': 150}, {'dept': '002', 'sku': 'bar', 'transId': 'uniqueId3', 'qty': 200}, {'dept': '002', 'sku': 'bar', 'transId': 'uniqueId4', 'qty': 250},]

使用defaultdict按dept分组grouped=defaultdict(list)for item in input: grouped[item['dept']].append(item['qty'])

计算每个分组的平均值averages={dept: sum(qties) / len(qties) for dept, qties in grouped.items()}

averages

输出结果将是一个字典,包含每个部门及其对应字典列表的平均值。

什么是通过多个键进行分组的最 pythonic方法,并在 Python中汇总字典列表的平均值?假设我有一个字典列表如下:

如何使用Python按多个键对字典列表进行分组并计算各组的平均值?

input = [ {'dept': '001', 'sku': 'foo', 'transId': 'uniqueId1', 'qty': 100}, {'dept': '001', 'sku': 'bar', 'transId': 'uniqueId2', 'qty': 200}, {'dept': '001', 'sku': 'foo', 'transId': 'uniqueId3', 'qty': 300}, {'dept': '002', 'sku': 'baz', 'transId': 'uniqueId4', 'qty': 400}, {'dept': '002', 'sku': 'baz', 'transId': 'uniqueId5', 'qty': 500}, {'dept': '002', 'sku': 'qux', 'transId': 'uniqueId6', 'qty': 600}, {'dept': '003', 'sku': 'foo', 'transId': 'uniqueId7', 'qty': 700} ]

期望的聚合输出:

output=[ {'dept': '001', 'sku': 'foo', 'qty': 400}, {'dept': '001', 'sku': 'bar', 'qty': 200}, {'dept': '002', 'sku': 'baz', 'qty': 900}, {'dept': '002', 'sku': 'qux', 'qty': 600}, {'dept': '003', 'sku': 'foo', 'qty': 700} ]

或平均:

output=[ {'dept': '001', 'sku': 'foo', 'avg': 200}, {'dept': '001', 'sku': 'bar', 'avg': 200}, {'dept': '002', 'sku': 'baz', 'avg': 450}, {'dept': '002', 'sku': 'qux', 'avg': 600}, {'dept': '003', 'sku': 'foo', 'avg': 700} ]

我发现了这个:Group by and aggregate the values of a list of dictionaries in Python但它似乎没有给我我想要的东西.

获得汇总结果

from itertools import groupby from operator import itemgetter grouper = itemgetter("dept", "sku") result = [] for key, grp in groupby(sorted(input_data, key = grouper), grouper): temp_dict = dict(zip(["dept", "sku"], key)) temp_dict["qty"] = sum(item["qty"] for item in grp) result.append(temp_dict) from pprint import pprint pprint(result)

产量

[{'dept': '001', 'qty': 200, 'sku': 'bar'}, {'dept': '001', 'qty': 400, 'sku': 'foo'}, {'dept': '002', 'qty': 900, 'sku': 'baz'}, {'dept': '002', 'qty': 600, 'sku': 'qux'}, {'dept': '003', 'qty': 700, 'sku': 'foo'}]

要获得平均值,您可以简单地更改for循环内的内容,就像这样

temp_dict = dict(zip(["dept", "sku"], key)) temp_list = [item["qty"] for item in grp] temp_dict["avg"] = sum(temp_list) / len(temp_list) result.append(temp_dict)

产量

[{'avg': 200, 'dept': '001', 'sku': 'bar'}, {'avg': 200, 'dept': '001', 'sku': 'foo'}, {'avg': 450, 'dept': '002', 'sku': 'baz'}, {'avg': 600, 'dept': '002', 'sku': 'qux'}, {'avg': 700, 'dept': '003', 'sku': 'foo'}]

建议:无论如何,我会在这样的dict中添加qty和avg

temp_dict = dict(zip(["dept", "sku"], key)) temp_list = [item["qty"] for item in grp] temp_dict["qty"] = sum(temp_list) temp_dict["avg"] = temp_dict["qty"] / len(temp_list) result.append(temp_dict)

产量

[{'avg': 200, 'dept': '001', 'qty': 200, 'sku': 'bar'}, {'avg': 200, 'dept': '001', 'qty': 400, 'sku': 'foo'}, {'avg': 450, 'dept': '002', 'qty': 900, 'sku': 'baz'}, {'avg': 600, 'dept': '002', 'qty': 600, 'sku': 'qux'}, {'avg': 700, 'dept': '003', 'qty': 700, 'sku': 'foo'}]