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 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告