Python - 每隔 K 个值进行分块求和


分块求和也称为部分和或滚动求和,它是一种计算序列(如列表、数组或任何可迭代对象)中元素的和的过程,但它是将序列分成较小的块或子集进行计算,而不是一次计算整个序列的和。每个块表示序列中一组连续的元素,并且分别计算每个块的和。

例如,考虑序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],让我们计算块大小为 3 的分块求和。

  • 块 1:[1, 2, 3] → 和:1 + 2 + 3 = 6

  • 块 2:[4, 5, 6] → 和:4 + 5 + 6 = 15

  • 块 3:[7, 8, 9] → 和:7 + 8 + 9 = 24

  • 块 4:[10] → 和:10

块大小为 3 的分块求和的结果将为 [6, 15, 24, 10]。

分块求和在各种场景中都很有用,例如处理大型数据集或时间序列数据,以避免内存相关问题并提高计算效率。它也常用于需要分段处理数据的算法和数据分析任务中。

为了在 Python 中执行分块求和,我们需要计算列表或可迭代对象中每隔 K 个值的和,我们可以使用各种方法。

使用循环

一种直接的方法是使用循环迭代列表或可迭代对象,并计算每隔 K 个值的和。

示例

在此示例中,我们初始化一个空列表 result 来存储分块和。我们还初始化 chunk_sum 来跟踪每个块的和。我们使用 enumerate 迭代值以获取索引 i 和值。我们将每个值添加到 chunk_sum 中,并检查 i 是否是 K 的倍数。如果是,我们将 chunk_sum 追加到 result 列表中并将 chunk_sum 重置为 0。最后,我们检查是否有任何剩余的值没有形成完整的块,并在需要时将它们追加到 result 列表中。

def chunked_sum_loop(values, K):
   result = []
   chunk_sum = 0
   for i, value in enumerate(values, 1):
      chunk_sum += value
      if i % K == 0:
         result.append(chunk_sum)
         chunk_sum = 0
   if chunk_sum != 0:
      result.append(chunk_sum)
   return result
values = [5,78,787,99,44,9,22]
K = 2
print("The chuncked sum of the given values:",chunked_sum_loop(values, K))

输出

The chuncked sum of the given values: [83, 886, 53, 22]

使用列表推导式

另一种方法是利用列表推导式生成分块和的列表。

示例

在此示例中,我们使用列表推导式以大小为 K 的块迭代值,使用 range 函数。对于每个块,我们使用 sum() 函数计算和,从而生成一个分块和的列表。

def chunked_sum_list_comprehension(values, K):
   return [sum(values[i:i+K]) for i in range(0, len(values), K)]
values = [5,78,787,99,44,9,22]
K = 2
print("The chuncked sum of the given values:",chunked_sum_list_comprehension (values, K))

输出

The chuncked sum of the given values: [83, 886, 53, 22]

使用 itertools.islice()

itertools 模块中的 islice() 函数提供了一种有效的方法来从可迭代对象中提取块。

示例

在此示例中,我们使用 iter() 从值中创建一个迭代器,并初始化一个空 result 列表。我们使用 islice() 连续提取大小为 K 的块,并将它们转换为列表。如果提取的块为空,则表示我们已到达值的末尾,因此我们将中断循环。否则,我们将使用 sum() 计算块的和,并将其追加到 result 列表中。

from itertools import islice
def chunked_sum_islice(values, K):
   iterator = iter(values)
   result = []
   while True:
      chunk = list(islice(iterator, K))
      if not chunk:
         break
      result.append(sum(chunk))
   return result
values = [5,78,7,8,9,9,4,4,9,22]
K = 2
print("The sum of the given values:",chunked_sum_islice(values, K))

输出

The sum of the given values: [83, 15, 18, 8, 31]

更新于: 2023年8月7日

109 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.