前言
python 中有個內建函數為「zip」,
他能夠快速的幫助我們將「有順序的多組內容」完成「一一對應的打包」
學會 zip 在特定情況下可以省掉大量的程式撰寫時間,
如果是初學者的話,沒有學會 zip 也能用相對比較複雜的方法實現一樣的功能,
但學會後也能體會到 zip 存在的便利。
比較 & 範例程式碼
zip 基本用法,將每一個元素依照位置一個個拉出來對齊
以下面例子而言,我們宣告 3 個 list a, b, c,
我們如果使用 zip,
就會將 a,b,c 依照順序抽出來,
從第一組 (1, 4, 7) -> (2, 5, 8) -> (3, 6, 9)
範例程式碼 – zip 基本用法
a = [1,2,3]
b = [4,5,6]
c = [7,8,9]
print(zip(a,b,c)) # <zip object at 記憶體位置>
print(list(zip(a,b,c))) # [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
詳細說明 – zip 基本用法
python3 之後,zip 的結果會成為一個 object,
如下我們印出「print(zip(a,b,c)) 」
<zip object at 記憶體位置>
我們經常需要搭配「list」才能夠得到我們可以使用的結果,
如下我們印出「print(list(zip(a,b,c))) 」
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
如果遇到組合元素不相等?
直接舉例,以下兩個 list 長度不相等。
結果會是「以比較短的 list 為主的全部組合」
a = [1, 2, 3]
b = ['a', 'b']
zipped = list(zip(a, b))
print(zipped) # 輸出: [(1, 'a'), (2, 'b')]
zip 搭配矩陣用法
- 我們先宣告一個矩陣
matrix = [
[1,2,3],
[4,5,6],
[7,8,9]
]
# matrix[::] = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(f"{matrix[::] = }")
zip 搭配矩陣用法,將每一個元素依照位置一個個拉出來對齊
(1) 藉由「matrix[::]」我們可以將矩陣元素一個個拉出來,
例如:「matrix[::] = [1, 2, 3] [4, 5, 6] [7, 8, 9]」
(2) 由 zip 將所有的元素「一個一個照順序」對應組在一起,
(1, 4, 7) -> (2, 5, 8) -> (3, 6, 9),
所有我們就能有一個全新的組合!
(3) 但是我們還需要靠 list 才能夠將 zip 的結果顯示成我們看得懂的樣子,
最後我們得到 list(zip(*matrix[::])) = [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
# *matrix[::] = [1, 2, 3] [4, 5, 6] [7, 8, 9],
print(*matrix[::])
# list(zip(*matrix[::])) = [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
print(f"{list(zip(*matrix[::])) = }")
【極為實用】zip = 轉置矩陣應用,用 zip 快速實作轉置矩陣
基本上這點就是 zip 最實用的功能!透過 zip 作轉置矩陣就是個「秒殺等級」的事情!
範例與 (2) 相同,注意橫列 [1,2,3] 被換成了直行 (1, 4, 7),
範例程式碼 – 使用 zip,做「轉置矩陣」
matrix = [
[1,2,3],
[4,5,6],
[7,8,9]
]
# *matrix[::] = [1, 2, 3] [4, 5, 6] [7, 8, 9],
print(*matrix[::])
# list(zip(*matrix[::])) = [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
print(f"{list(zip(*matrix[::])) = }")
範例程式碼 – 如果不使用 zip,要「轉置矩陣」我們可能就需要這麼做
import copy
matrix = [
[1,2,3],
[4,5,6],
[7,8,9]
]
new_matrix = copy.deepcopy(matrix) # 複製一樣的大小,內容一樣沒關係,等等就換掉了
# (需要使用deepcopy,不然值被改掉後,我們會去取到錯誤被改過的值。)
for y_idx in range(len(matrix)):
for x_idx in range(len(matrix[0])):
new_matrix[x_idx][y_idx] = matrix[y_idx][x_idx]
print(new_matrix)
補充 – 矩陣旋轉 90 度 (也是 leetcode 第 48 題)
然後我們先進行上下交換,透過 zip 進行轉置,
可以快速又炫的解完矩陣 「旋轉 90 度」 這個難題。
(或者也可以用先透過 zip 進行轉置,再進行左右交換,
也能實現「矩陣旋轉 90 度」的功能)
matrix = [
[1,2,3],
[4,5,6],
[7,8,9]
]
# matrix[::-1] = [[7, 8, 9], [4, 5, 6], [1, 2, 3]]
print(f"{matrix[::-1] = }")
# list(zip(*matrix[::-1])) = [(7, 4, 1), (8, 5, 2), (9, 6, 3)]
print(f"{list(zip(*matrix[::-1])) = }")
matrix[::] = zip(*matrix[::-1]) # 題目需求:change in-place
print(matrix)
關於這題 (leetcode 第 48 題),詳細解說可以參考我的另外一篇文章:
【Leetcode】python – [48] Rotate Image 個人解法筆記 (updated: 2022/5/29)
Reference
https://www.runoob.com/python/python-func-zip.html
[…] 【Python】python zip 使用方法 與 其他寫法比較整理 (內含範例程式碼) sample code […]
[…] 【Python】python zip 使用方法 與 其他寫法比較整理 (內含範例程式碼) sample code […]