譯者 | 劉濤
審校 | 重樓
在Python編程領域,zip() 函數(shù)以其簡潔性而著稱,它能夠將多個列表或其他可迭代對象(如元組、集合乃至字符串)巧妙地合并成一個元組構成的可迭代對象。想象一下,它就像夾克上的拉鏈,巧妙地將兩側緊密連接在一起。
在本指南中,我們將通過簡單實用的示例深入探討 zip() 函數(shù)的來龍去脈,幫助你理解如何有效地使用它。
zip() 函數(shù)工作原理
zip() 函數(shù)根據(jù)位置將多個可迭代對象(如列表)中的元素配對。這意味著每個列表的首個元素將先被配對,然后是第二個元素,依此類推。如果可迭代對象的長度存在差異,zip()函數(shù)將在最短的可迭代對象結束時停止運行。
zip()函數(shù)的語法非常簡單:
zip(*iterables)
你可以傳入多個可迭代對象(例如列表、元組等),zip()函數(shù)會將它們組合成元組。
示例1:組合兩個列表
讓我們從一個簡單的場景開始,假設我們有兩個列表,想要將它們組合起來。想象一下,你有一個姓名列表和一個對應的分數(shù)列表,你期望將它們配對。
# Two lists to combine
names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 88]
# Using zip() to combine them
zipped = zip(names, scores)
# Convert the result to a list so we can see it
zipped_list = list(zipped)
print(zipped_list)
在這個示例當中,zip() 函數(shù)把兩個列表names 和 scores逐一對元素進行配對。names 中的第一個元素(“Alice”)與 scores 中的第一個元素(85)進行配對,依此類推。當我們把結果轉化為列表時,其呈現(xiàn)出如下模樣:
[('Alice', 85), ('Bob', 90), ('Charlie', 88)]
這使得以結構化的方式處理相關數(shù)據(jù)變得容易。
示例2:當列表長度不均等時會出現(xiàn)什么情況
假設你有不同長度的列表。那會發(fā)生什么呢?zip() 函數(shù)十分聰明,當它到達最短列表的末尾時會立即停止。
# Lists of different lengths
fruits = ["apple", "banana"]
prices = [100, 200, 150]
# Zipping them together
result = list(zip(fruits, prices))
print(result)
在這種情況下,fruits 列表有兩個元素,而 prices 列表有三個。但 zip() 只會組合前兩個元素,忽略 prices列表中多余的值。輸出:
[('apple', 100), ('banana', 200)]
請注意,prices列表中的最后一個值(150)被忽略掉了,因為fruits列表中不存在第三個元素與它配對。zip() 函數(shù)能夠確保在處理長度不均等的列表時不會產生錯誤,然而這也意味著倘若你的列表中元素不均衡,你或許會丟失一部分數(shù)據(jù)。
示例3:解壓縮對象
若你期望對zip()操作進行反轉,即在將兩個列表進行壓縮處理之后,你或許想要將它們再度拆解為單獨的列表。此時,你可以使用解包運算符 * 來便捷地達成這一目標。
# Zipped lists
cities = ["New York", "London", "Tokyo"]
populations = [8000000, 9000000, 14000000]
zipped = zip(cities, populations)
# Unzipping them
unzipped_cities, unzipped_populations = zip(*zipped)
print(unzipped_cities)
print(unzipped_populations)
在這里,我們首先使用zip()函數(shù)將city和populations列表壓縮在一起。然后,通過zip(*zipped)解壓縮的方式,將合并后的元組“解壓”回兩個單獨的列表。這里的*運算符起到了解包的作用,它將zipped(即之前通過zip()函數(shù)得到的元組迭代器)中的元組解包成它們原始的組成部分。輸出:
('New York', 'London', 'Tokyo')
(8000000, 9000000, 14000000)
這個示例展示了如何反轉壓縮(zipping)過程以恢復原始數(shù)據(jù)。
示例4:壓縮兩個以上列表
在使用 zip() 函數(shù)時,并非局限于僅對兩個列表進行壓縮。你能夠依據(jù)自身需求對任意數(shù)量的可迭代對象進行壓縮。以下呈現(xiàn)的是一個包含三個列表的實例。
# Three lists to zip
subjects = ["Math", "English", "Science"]
grades = [88, 79, 92]
teachers = ["Mr. Smith", "Ms. Johnson", "Mrs. Lee"]
# Zipping three lists together
zipped_info = zip(subjects, grades, teachers)
# Convert to a list to see the result
print(list(zipped_info))
在這個示例中,我們將壓縮三個列表——subjects、grades和 teachers。來自每個列表的第一個項目被組合在一起,隨后是第二個,依此類推。 輸出:
[('Math', 88, 'Mr. Smith'), ('English', 79, 'Ms. Johnson'), ('Science', 92, 'Mrs. Lee')]
這樣,你可以將多個相關的信息片段組合成易于處理的元組。
示例5:壓縮字符串
在Python中,字符串也是可迭代對象,因此你可以像處理列表一樣對它們使用zip()函數(shù)。讓我們嘗試將兩個字符串組合在一起。
# Zipping two strings
str1 = "ABC"
str2 = "123"
# Zipping the characters together
zipped_strings = list(zip(str1, str2))
print(zipped_strings)
在這個示例中,str1的第一個字符將與str2的第一個字符組合在一起,以此類推。輸出:
[('A', '1'), ('B', '2'), ('C', '3')]
如果你需要處理多個字符串中的字符,或者將多個字符串中的字符進行配對組合,那么這會特別有用。
示例6:壓縮字典
盡管字典(dictionaries )與列表存在些許差異,但是你依然能夠運用 zip() 將它們組合起來。默認狀況下,zip()僅僅會壓縮字典的鍵(keys)。下面讓我們來看一個示例:
# Two dictionaries
dict1 = {"name": "Alice", "age": 25"}
dict2 = {"name": "Bob", "age": 30"}
# Zipping dictionary keys
zipped_keys = list(zip(dict1, dict2))
print(zipped_keys)
在這里, zip() 將兩個字典中的鍵配對。輸出:
[('name', 'name'), ('age', 'age')]
如果你想壓縮字典的值,你可以使用.values()方法來實現(xiàn):
zipped_values = list(zip(dict1.values(), dict2.values()))
print(zipped_values)
輸出:
[('Alice', 'Bob'), (25, 30)]
現(xiàn)在,你可以輕松地組合兩個字典的值。
示例7:在循環(huán)中使用 zip()
zip() 最常見的用途之一是在循環(huán)(loops)中,當你想同時處理多個列表時。下面是一個示例:
# Lists of names and scores
names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 88]
# Using zip() in a loop
for name, score in zip(names, scores):
print(f"{name} scored {score}")
這個循環(huán)同時遍歷了names和scores兩個列表,將每個名字與其對應的分數(shù)進行配對。輸出:
Alice scored 85
Bob scored 90
Charlie scored 88
在循環(huán)中使用zip()函數(shù),當你處理相關數(shù)據(jù)時,就可以使你的代碼更加整潔和易于閱讀。
結論
zip()函數(shù)是Python中一個非常實用的工具,它允許你將多個可迭代對象組合成元組,從而更容易地處理相關數(shù)據(jù)。無論你是在將列表、元組或字符串中的項目配對,zip()都能簡化你的代碼,并且在循環(huán)中特別有用。
通過本文中的示例,你應該對如何在各種情況下使用zip()有了很好的理解。
如果你發(fā)現(xiàn)這個關于Python的zip()函數(shù)的解釋很有幫助,那么你可能會喜歡我在博客上分享的更多深入編程教程和概念。
譯者介紹
劉濤,51CTO社區(qū)編輯,某大型央企系統(tǒng)上線檢測管控負責人。
原文標題:Python’s zip() Function Explained with Simple Examples,作者:Sahil Mahapatra