Python - 多键分组求和

pythonserver side programmingprogramming

给定的问题陈述是获取给定元组列表中相同键的分组求和。因此,我们将使用 Python 功能为该问题编写程序。

理解问题

当前的问题是根据多个键计算给定输入列表数据中的值的总和,此过程称为多键分组求和。因此,我们将获得具有键和值对的数据。我们的任务是根据多个键对值进行分组,并且我们必须计算给定列表中每个组的总和。

上述问题的逻辑

为了解决这个问题,我们将使用字典来保存当前组的累积加法。我们将遍历列表数据并获取键值。借助键,我们将将相应的值添加到每个组的累积总和中。如果字典中没有特定值的组,我们将从当前值开始。最后,我们将得到给定列表数据中每个组的总和。

算法

  • 步骤 1 - 首先,我们将导入必要的模块。因此,从 Python 中的 collections 模块导入 defaultdict 类。

  • 步骤 2 - 然后初始化包含输入数据的 list_data。

  • 步骤 3 - 之后,创建一个空的 defaultdict 作为 grouped_sum,初始值为 0。

  • 步骤 4 - 接下来,迭代列表元组中的每个数据。并从元组中获取键值。

  • 步骤 5 - 还提取与元组关联的值。并将该值添加到 grouped_sum 中相应键的累积总和中。

  • 步骤 6 - 然后,我们将通过遍历 grouped_sum 中的项目创建新列表作为输出,并且对于每个键值对,我们将创建一个具有总和值的新元组。

  • 步骤 7 - 打印初始输入列表和输出列表以显示多个键的分组总和。

示例

# 导入 defaultdict
from collections import defaultdict

# 初始化列表数据
list_data = [
   (1000, 2022, 1),
   (1500, 2022, 2),
   (2000, 2022, 1),
   (500, 2023, 3),
   (800, 2023, 1),
   (1200, 2023, 1),
   (1500, 2023, 3)
]

print("输入列表为: " + str(list_data),'\n')

grouped_sum = defaultdict(int)

for data in list_data:
   # 获取键值和值
   key = data[1:3]
   value = data[0]  
   grouped_sum[key] += value

Output = [(key[0], key[1], value) for key, value in grouped_sum.items()]

# 打印输出
print("多个键分组求和: " + str(Output))

输出

输入列表为:[(1000, 2022, 1), (1500, 2022, 2), (2000, 2022, 1), (500, 2023, 3), (800, 2023, 1), (1200, 2023, 1), (1500, 2023, 3)]

多个键分组求和:[(2022, 1, 3000), (2022, 2, 1500), (2023, 3, 2000), (2023, 1, 2000)]

复杂度

如果输入数据中的键和值对的数量为 n,则计算具有相同键的值之和的时间复杂度为 O(n)。因为我们对每对迭代一次并执行了恒定时间操作以获取所需的和或值。

结论

我们已经借助字典有效地实现了多键分组求和的代码,以保存每个键值对的累积和。并且我们使用了 Python 中 collections 模块中名为 defaultdict 的内置类。该代码的时间复杂度为 O(n)。


相关文章