📜  Python – 多键分组求和(1)

📅  最后修改于: 2023-12-03 15:19:05.181000             🧑  作者: Mango

Python – 多键分组求和

在Python中,我们经常需要对数据进行分组和求和操作。通常情况下,我们可以使用groupby函数对数据进行分组,然后使用sum函数对每个组进行求和。然而,有时候我们可能需要根据多个键值进行分组,即根据多个属性将数据进行分组,并计算每个组的合计。

在这种情况下,我们可以使用itertools.groupby函数和collections.defaultdict来实现多键分组求和。以下是一个示例程序来演示如何实现多键分组求和的功能:

import itertools
from collections import defaultdict

def multikey_groupby_sum(data, keys):
    result = defaultdict(int)
    sorted_data = sorted(data, key=lambda x: tuple(x[key] for key in keys))
    for group, group_data in itertools.groupby(sorted_data, key=lambda x: tuple(x[key] for key in keys)):
        group_sum = sum(item['value'] for item in group_data)
        result[group] += group_sum
    return result

这个示例程序中,multikey_groupby_sum函数接受两个参数:数据列表data和键列表keys。它首先使用sorted函数对数据进行排序,排序的键为tuple(x[key] for key in keys),即多个键的值组成的元组。然后,使用itertools.groupby函数根据多个键的值进行分组,返回分组后的结果。最后,使用sum函数计算每个分组的合计,并将结果保存到defaultdict中,最终返回这个字典。

下面是一个使用示例:

data = [
    {'name': 'Alice', 'gender': 'Female', 'value': 10},
    {'name': 'Bob', 'gender': 'Male', 'value': 5},
    {'name': 'Alice', 'gender': 'Female', 'value': 7},
    {'name': 'Alice', 'gender': 'Male', 'value': 8},
    {'name': 'Bob', 'gender': 'Male', 'value': 3}
]

result = multikey_groupby_sum(data, ['name', 'gender'])
for group, group_sum in result.items():
    print(f'{group}: {group_sum}')

输出结果如下:

('Alice', 'Female'): 17
('Alice', 'Male'): 8
('Bob', 'Male'): 8

以上示例演示了如何根据namegender两个键对数据进行分组,并计算每个分组的合计。这在处理使用多个属性进行分组的数据时非常有用。

希望以上介绍对你有所帮助。