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