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]
使用列表推导式
另一种方法是利用列表推导式来生成一个分块求和的列表。
示例
在这个示例中,我们使用列表推导式来使用range函数迭代以大小为K的块中的值。对于每个块,我们使用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()从values创建了一个迭代器,并初始化一个空的结果列表。我们使用islice()连续地提取大小为K的块,并将它们转换为列表。如果提取的块为空,意味着我们已经到达了values结尾,所以我们会中断循环。否则,我们将使用sum()计算块的和,并将其附加到结果列表中。
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]