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]
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP