Python-Itertools.zip_longest()


簡介

在程式設計領域,熟練性和靈活性是工程師努力實現的關鍵要素。Python 是一種以其簡潔性和一致性而聞名的語言,它提供了許多內建函式來幫助實現這些目標。其中一個函式是 `itertools.zip_longest()`,它定義在 Python 的 `itertools` 模組中,在處理長度不等的迭代器方面發揮著重要作用。在本文中,我們將深入探討 `itertools.zip_longest()` 的內部工作原理,研究其優點、用例、挑戰以及針對不同應用的建議。

Itertools.zip_longest() 解釋?

`zip_longest()` 函式透過將多個迭代器“壓縮”成元組來組合它們。它透過利用稱為同步的演算法正規化來實現這一點。

在並行演算法中,同步是指透過阻塞直到多個執行緒到達一個共同點來協調併發程序。`zip_longest()` 使用這種方法並行化迭代器的使用。理論上,`zip_longest()` 實現了一種會合迭代器模式。它同步地推進多個迭代器,暫停對速度較快的迭代器的使用以保持同步。這使得跨迭代器的輸出生成保持一致。

當迭代器長度不一致時,同步需要用填充值來填充較短的迭代器以匹配最長長度。`zip_longest()` 透過使用可配置的填充值來處理這個問題,預設為 `None`。從數學角度來看,這構成了迭代器之間的笛卡爾積,填充類似於關係代數中的交叉連線。兩個集合的笛卡爾積包含它們所有可能的順序對。

因此,`zip_longest()` 可以用集合論來建模為一個填充的笛卡爾積。它靈活地適應具有不均勻集合的現實世界迭代環境的笛卡爾積。從計算的角度來看,`zip_longest()` 對長度為 N 的 k 個迭代器的時間複雜度為 O(k*N),因為每個元素都會被訪問。空間複雜度為 O(k) 用於輸出。

itertools.zip_longest() 是 Python 的 itertools 模組提供的函式,它解決了常見的程式設計難題:

組合可能長度不同的多個迭代器,同時保證其元素的平滑排列。當您處理可能沒有相同數量元素的資料來源時,它特別有用,並且您希望以繫結的方式準備或分析它們。

itertools.zip_longest() 的核心思想是建立一個迭代器,該迭代器產生包含來自輸入迭代器元素的元組。這些元組的構建方式考慮了輸入迭代器長度的變化。如果一個迭代器比其他迭代器長,則保留多餘的元素,而從較短的迭代器中丟失的元素將用指定的填充值填充。

語法

zip_longest(*iterables, fillvalue=None)

它將任意數量的迭代器作為位置引數。可選的 `fillvalue` 引數指定當迭代器短於最長迭代器時使用的填充值。預設情況下,使用 `None` 作為填充值。

`zip_longest()` 返回一個包含從傳入迭代器中配對的元素的元組的迭代器。它記憶體效率高,因為輸入是惰性消費的。

示例 1

from itertools import zip_longest

nums1 = [1, 2, 3] 
nums2 = [10, 20]

print(list(zip(nums1, nums2))) 
# [(1, 10), (2, 20)] 

print(list(zip_longest(nums1, nums2)))
# [(1, 10), (2, 20), (3, None)]

輸出

[(1, 10), (2, 20)]
[(1, 10), (2, 20), (3, None)]

示例 2

from itertools import zip_longest

keys = ['name', 'age', 'city']
data = [['John'], ['25'], ['New York', 'Chicago']]

records = [dict(zip_longest(keys, parts, fillvalue=''))  
   for parts in data]

print(records)

# [{'name': 'John', 'age': '', 'city': ''},  
#  {'name': '', 'age': '25', 'city': ''},
#  {'name': '', 'age': '', 'city': 'New York'}]

輸出

[{'name': 'John', 'age': '', 'city': ''}, {'name': '25', 'age': '', 'city': ''}, {'name': 'New York', 'age': 'Chicago', 'city': ''}]

應用和意義

itertools.zip_longest() 的應用意義在不同的領域中得到了增強。在機器學習的資料預處理中,其中提取包括合併不同的資料來源,該函式展示了其效用。此外,在自然語言處理中,結合長度不同的序列,例如句子及其相應的評價名稱,與 itertools.zip_longest() 相容。

結論

`zip_longest()` 在壓縮長度不一致的迭代器時提供了更多控制。填充、方向控制和填充值自定義功能允許乾淨地處理不同的迭代器。它是一個方便的工具,用於在 Python 的迭代、推導和對映中以程式設計方式整齊地合併、配對和處理長度不匹配的資料。雖然 `zip()` 適用於長度相等的用例,但 `zip_longest()` 提供了靈活性,使其非常適合涉及非對稱性的現實世界資料整理任務。

更新於:2023年10月23日

243 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告