zip() 接受一系列可疊代的對象作為參數,将對象中對應的元素打包成一個個 tuple,然後傳回由這些 tuple 組成的 list。
若傳入參數的長度不等,則傳回 list 的長度和參數中長度最短的對象相同。
利用 * 号操作符,可以将 list 解壓。
Python3.0開始,zip()函數已經不傳回 list 了,而是傳回 iterable(可疊代對象)。這個可疊代對象需要特别注意,隻能進行一次疊代周遊,第二次周遊就是空了。這個坑了我一個多小時。
# 簡單示例
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9, 10, 11]
ab = zip(a, b)
print(list(ab)) # [(1, 4), (2, 5), (3, 6)]
# zip()之後的結果隻能“使用一次”
# zip()實際上是一個生成器對象,故使用list()擷取zip()結果時,已經相當于是完成一次疊代周遊
# 第二次再次使用list()時疊代已經結束,是以傳回[]
print(list(ab)) # []
ac = zip(a, c)
# print(list(ac)) # [(1, 4), (2, 5), (3, 6)],以短的為準
_ac = zip(*ac) # 與 zip 相反,可了解為解壓,傳回二維矩陣式
print(list(_ac)) # [(1, 2, 3), (7, 8, 9)],如果沒把上面的 print(list(ac)) 注掉,這裡的顯示結果就是[]了
# 應用示例一
print('應用示例一')
name = ('jack', 'alex', 'sony', 'joey')
age = (25, 28, 21, 30)
for a, n in zip(name, age):
print(a, n)
# 應用示例二:二維矩陣行列轉換
print('應用示例二')
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(list(map(list, zip(*a)))) # [[1, 4, 7], [2, 5, 8], [3, 6, 9]], map()函數把zip(*a)後的每一個元素轉化為list
複制