pcwu's TIL Notes


[Python] zip 函數小筆記

zip 將 iterables 的元素進行配對,儲存在回傳的序對中,回傳的是 tuple:

a = "abcde"
b = (1, 2, 3, 4, 5)
c = [6, 7, 8, 9, 0]
d = zip(a, b, c)

# d: [('a', 1, 6), ('b', 2, 7), ('c', 3, 8), ('d', 4, 9), ('e', 5, 0)]

簡單的應用,但有時用起來很厲害。

例如 leetcode 048: Rotate Image 這篇,要將圖片做順時針90度旋轉,要先上下對稱交換,再斜線交換:

/*
 * clockwise rotate
 * first reverse up to down, then swap the symmetry
 * 1 2 3     7 8 9     7 4 1
 * 4 5 6  => 4 5 6  => 8 5 2
 * 7 8 9     1 2 3     9 6 3
*/

如果正常寫法的話,大概是:

def rotate(self, matrix):
    n = len(matrix)
    matrix.reverse()
    for i in xrange(n):
        for j in xrange(i, n):
            matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]

但如果用 zip 的話,非常的精簡:

def rotate(self, A):
    A[:] = zip(*A[::-1])

或也可以套個 list 讓他不是 tuple:

def rotate(self, A):
    A[:] = map(list, zip(*A[::-1]))