前言
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