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]