假設我們有兩個列表,一個包含名字,另一個包含姓氏。我們希望以某種方式將名字與相應的姓氏組合成元組。換句話說,我們希望將來自多個具有相同索引的迭代對象的元素組合在一個元組列表中:
list_1 = [『Jane』, 『John』, 『Jennifer』]list_2 = [『Doe』, 『Williams』, 『Smith』]Desired Output:[('Jane', 'Doe'), ('John', 'Williams'), ('Jennifer', 'Smith')]我們可以使用 zip()函數來實現這一點,這是一個內置的 Python 函數。函數之所以命名為 zip()函數,是因為它的類似機制是物理拉鏈。當你拉上拉鏈的時候,你把兩邊都拉在了一起。這就是 zip()函數的工作原理!它將來自多個迭代對象的相同索引的元素作為相同元組的元素放在一起。函數接受迭代對象作為參數,例如列表、文件、元組、集合等。函數將創建一個迭代器,從傳入的每個迭代對象中聚合元素。換句話說,它將返回一個元組迭代器,其中 i-th 元組將包含傳入的每個迭代器中的 i-th 元素。一旦最短的輸入迭代用完,該迭代器將停止。基於上述目標,我們有兩個列表(這是可迭代的對象) ,我們希望將每個列表中相同的索引元素組合在一起。因此,我們可以使用 zip()函數來完成以下任務:first_names = [『Jane』, 『John』, 『Jennifer』]last_names = [『Doe』, 『Williams』, 『Smith』]full_names = list(zip(first_names, last_names))print(full_names)# [('Jane', 'Doe'), ('John', 'Williams'), ('Jennifer', 'Smith')]請記住,zip()函數返回一個迭代器。因此,我們需要使用 list()函數,它將使用這個返回的迭代器(或 zip對象)來創建列表。此外,只要傳入的迭代對象是有序的(序列) ,那么元組將包含與在 zip()函數中傳入的參數相同的從左到右順序的元素。假設我們有另外一個列表,年齡,包含了另外兩個列表中相應個體的年齡,名字和姓氏。我們還想在元組中包括年齡,並且有名和姓。如上所述,zip()函數可以接受任意數量的迭代。first_names = ['Jane', 'John', 'Jennifer']last_names = ['Doe', 'Williams', 'Smith']ages = [20, 40, 30]names_and_ages = list(zip(first_names, last_names, ages))print(names_and_ages)# [('Jane', 'Doe', 20), ('John', 'Williams', 40), ('Jennifer', 'Smith', 30)]請注意 names_and_ages 是如何包含帶有 n 個元素的元組(參數數量相同,或者可迭代對象,我們傳遞給 zip()函數)。如果我們只將一個可迭代的對象傳遞給 zip()函數,那麼我們將得到一個包含1條目元組的列表,如下所示:first_names = ['Jane', 'John', 'Jennifer']print(list(zip(first_names)))# [('Jane',), ('John',), ('Jennifer',)]如果我們傳入長度不等的列表(或其他可迭代對象)會怎樣?換句話說,假設我們的姓氏列表比名字列表多包含1個元素。如上所述,一旦最短的輸入迭代用完,zip()函數返回的迭代器就會停止。換句話說,我們的元組列表將只包含索引中的元素,這些元素出現在傳遞到 zip()函數的所有迭代中。因此,在較長的迭代中的其餘元素將被忽略。first_names = [『Jane』, 『John』, 『Jennifer』]last_names = [『Doe』, 『Williams』, 『Smith』, 'Jones']full_names = list(zip(first_names, last_names))print(full_names)# [('Jane', 'Doe'), ('John', 'Williams'), ('Jennifer', 'Smith')]如果需要較長的迭代對象中的元素,那麼我們可以使用 itertools.zip _ longest ()函數來代替 zip()函數。它將繼續執行,直到用盡最長的可迭代值,並將用傳入的 fillvalue 參數值(默認值為 None)替換任何缺失的值。我們可以使用 zip()函數並行迭代多個迭代對象。因為 zip()函數返回一個迭代器,所以我們可以在 for 循環中使用這個 zip 對象(它返回的迭代器)。由於每次迭代都返回一個元組,我們可以在 for 循環中 unzip 這個元組的元素:first_names = ['Jane', 'John', 'Jennifer']last_names = ['Doe', 'Williams', 'Smith']for first, last in zip(first_names, last_names): print(first, last)Jane DoeJohn WilliamsJennifer Smithfirst_names = [『Jane』, 『John』, 『Jennifer』]last_names = [『Doe』, 『Williams』, 『Smith』]ages = [20, 40, 30]for first, last, age in zip(first_names, last_names, ages): print(f』{first} {last} is {age} years old』)Jane Doe is 20 years oldJohn Williams is 40 years oldJennifer Smith is 30 years old我們有兩個清單: 收入清單和成本清單。我們想再列一個表,利潤,也就是收入和成本之間的差額。我們可以通過並行迭代來實現:revenue = [30000, 50000, 70000, 90000]cost = [10000, 15000, 20000, 30000]profit = []total_profit = 0for revenue, cost in zip(revenue, cost): profit.append(revenue — cost) total_profit += revenue — costprint(profit)print(total_profit)first_and_last_names = [('Jane', 'Doe'), ('John', 'Williams'), ('Jennifer', 'Smith')]我們希望將這些元組中的元素分離成兩個單獨的列表。好吧,既然這是拉鏈的反義詞(把東西拉在一起) ,那就是拉鏈的解開(把東西拆開)。要在 Python 中進行 unzip 操作,我們可以使用 zip()函數的 unzip 操作符 * ,如下所示:first_names, last_names = zip(*first_and_last_names)first_names = list(first_names)last_names = list(last_names)print(first_names)# ['Jane', 'John', 'Jennifer']print(last_names)# ['Doe', 'Williams', 'Smith']unpacking 運算符 * 將元組的第一個和最後一個名稱列表 unpack 到它的元組中。然後,這些元組將被傳遞給 zip()函數,該函數將接收這些單獨的可迭代對象(元組) ,並將它們相同的索引元素組合成元組,形成兩個單獨的元組。最後,通過元組 unpack 操作,這些分隔的元組將被分配給名字和姓氏變量。然後,我們使用 list()函數將這些元組轉換為列表。在本教程中,我們了解了 zip()函數在 Python 中是如何工作的。我們了解了 zip()函數在不同場景中的操作方式,比如使用一個迭代或者使用長度不等的迭代。然後,我們看到了如何使用 zip()函數並行迭代多個迭代對象。最後,我們學習了如何使用解壓縮操作符 * 來解壓 Python 中的對象。