Phyhon-內置函數zip()

 zip(iterable...)主要作用是將可迭代對象(list、string等)作爲參數,將迭代對象1、2、3中相同位置的參數,組成元組的可迭代對象(可支持遍歷的對象)。最後可以轉換成一種格式(列表、字典、元組)。

例子1 (說明 可迭代對象和最後轉換的區別)

a = [1,2,3]
b = [10,11,12]
c = zip(a,b)  
print(c)   
print(tuple(c))

'''
output:
<zip object at 0x000000BFA26A87C8>   ##可迭代的對象
((1, 10), (2, 11), (3, 12))'''

例子2 (說明 a b 兩個列表長短不一的問題  ->以短的爲主

a = [1,2,3,4]
b = [10,11,12]
c = zip(a,b)  ##迭代器

print(tuple(c)) 
'''
## output : ((1, 10), (2, 11), (3, 12))
## 以短的爲主,截取a[0:len(b)]'''

例子3 (說明 * 在zip中的使用    *zip()函數是zip()函數的逆過程,將zip對象變成原先組合前的數據)

a = [[1,2],[3,4]]
b = [[10,11],[12,13]]
c = zip(a,b)  ##迭代器
print(list(c))  ## output: [([1, 2], [10, 11]), ([3, 4], [12, 13])]

m,n = zip(*zip(a,b)) 
'''
## 將打包好的 zip(a,b) 也就是 [([1, 2], [10, 11]), ([3, 4], [12, 13])]
## 解壓 * zip(a,b) -> [1,2],[3,4] 和 [10,11],[12,13]
## 解壓後各自封裝 -> ([1,2],[3,4]) 和 ([10,11],[12,13])'''


print(list(m),n) 
## tuple->list,n保持原結構
## [[1,2],[3,4]] ([10,11],[12,13])

print(type(n)) 
# output: <class 'tuple'>

例子4(zip 簡單應用 )

a = 'abc'
b = '123'
c = zip(a,b)  
print(dict(c)) 

'''
{'a': '1', 'b': '2', 'c': '3'} 簡單字典key-value對應'''


# 矩陣點乘
m = [[1, 2, 3],  [4, 5, 6],  [7, 8, 9]]
n = [[2, 2, 2],  [3, 3, 3],  [4, 4, 4]]
# 矩陣點乘
print('=*'*10 + "矩陣點乘" + '=*'*10)
print([x*y for a, b in zip(m, n) for x, y in zip(a, b)])

'''應用2來自:https://www.cnblogs.com/waltsmith/p/8029539.html'''

例子5 (Leetcode 面試題01.07 旋轉矩陣 ->將N*N的矩陣順時針旋轉90度)

 https://leetcode-cn.com/problems/rotate-matrix-lcci/comments/(解法來自此題評論中的@angus123 )

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        matrix[::] = zip(*matrix[::-1])

分析一下這簡潔我卻看不懂的代碼:

matrix = [[ 5, 1, 9,11],
          [ 2, 4, 8,10],
          [13, 3, 6, 7],
          [15,14,12,16]]

matrix[::-1] 將矩陣上下翻轉->

matrix = [[15,14,12,16],
          [13, 3, 6, 7],
          [ 2, 4, 8,10],
          [ 5, 1, 9,11]]

*matrix[::-1] 翻轉後的矩陣去掉外層格式( *號的作用是將可迭代序列拆開,作爲函數的實參)(應該是這樣的作用,我還不太明白 -,- 現在這樣寫)

[15, 14, 12, 16] [13, 3, 6, 7] [2, 4, 8, 10] [5, 1, 9, 11]

zip(*matrix[::-1] ) ->取每個可迭代對象中的元素

(15, 13, 2, 5), (14, 3, 4, 1), (12, 6, 8, 9), (16, 7, 10, 11)

將值傳給matrix,即更改matrix,完成旋轉。

[(15, 13, 2, 5), (14, 3, 4, 1), (12, 6, 8, 9), (16, 7, 10, 11)]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章