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)]

 

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