項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 search-input 尚未註冊或是沒有一個 view.php 檔案.

【Python 進階語法 #7】python zip – 使用方法 與 其他寫法比較整理

前言

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