Python:【基础语法】 zip()函数
zip()函数
1.描述
Python3中zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象。通常使用环境为不同的迭代器对应元素之间有关联。
2.语法
zip([iterable, ...])
3.参数
- iterable -- 若干个(>=1)迭代器
4.返回值
返回一个zip对象
1.如果各个迭代器的元素个数不一致,则返回对象的长度与最短的迭代器相同
2.利用 * 号操作符,可以将元组解压为列表(n元组即解压为n个列表)
3.使用 list() 转换zip对象来输出列表
5.实例
(1) 打包
>>>a=[1,5,9]
>>>b=[2,6,10]
>>>zipped=zip(a,b)
>>>zipped
#输出zip对象
<zip object at 0x7f35501e4b80>
#转换成列表输出
>>>lis=list(zipped)
>>>lis
#输出列表,元素为二元组
[(1, 2), (5, 6), (9, 10)]
(2) 解压
即使用zip(*zipped)操作,返回元组(个数为打包的迭代器个数)
>>>a=[1,5,9]
>>>b=[2,6,10]
>>>zipped=zip(a,b)
>>>a1,a2=zip(*zipped)
>>>a1
#a1,a2均为元组
(1, 5, 9)
>>>a1=list(a1)
>>>a1
[1, 5, 9]
#简洁写法
>>>res=zip(*zip(a,b))
>>>a1,a2=[list(x) for x in res]
>>>a1
>>>a2
[1, 5, 9]
[2, 6, 10]
【注意】
zip 是一个生成器的函数,它的结果是一个迭代器,该结果只能调用一次
如,将上面两个例子写在一起的话会出现
>>>a=[1,5,9]
>>>b=[2,6,10]
>>>zipped=zip(a,b)
>>>lis=list(zipped)
>>>res=zip(zipped)
>>>a1,a2=[list(x) for x in res]
第四行时,调用过依次zipped这个zip函数的结果,而在第五行有调用,此时zipped为空,报错:
这里再额外说一下 Python 中 *
运算符:
① 乘法运算:
在Python中,*表示乘法,**表示次方
② 形参:
*
在 python 中做函数形参,可以表示一个可变长度的序列,是tuple类型,而**
也可以做形参,而且是dict类型,他俩可以同时作为函数形参,且*
放在前,**
放在后。
def myprint(*params):
print(params)
调用 myprint
:
myprint(1,2,3)
结果:
(1,2,3)
因此作用是将调用时提供的所有值,放在一个元组里。
而对于**
def myprint(**params):
print(params)
调用 myprint
:
myprint(x=1,y=2,z=3)
结果:
{'z':3,'x':1,'y':2}
因此作用是将调用时提供多个关键字参数的值,放在一个字典里。
③ 序列解包运算
也就是把一段不定长数据转换成list,注意这里不是tuple
了,而是List
>>>a, *c = 1, 2, 3, 4
>>>b, *d = [5, 6, 7]
>>>print(c)
>>>print(d)
[2, 3, 4]
[6, 7]
其作用为收集赋值过程中多余的值,结果存放在list
中,但是要注意的是不能单独使用如:*c = 1, 2, 3, 4
当然也可以进行逆操作,即将列表(序列)分解
>>>print(*[1, 2, 3, 4])
>>>print(*[[1, 2], [3, 4]])
1 2 3 4
[1, 2] [3, 4]
④ zip 解包运算
即为上面的 zip 解压操作。
(3) 应用场景
场景描述1:两个 list 一一对应,将一个 list 排序,要求另一个 list 随之排序
点击查看代码
a=[9,1,5]
b=[10,2,6]
#打包
zipped=zip(a,b)
#排序,以序列a为基准排序,得到对应的b在a的排序后的序列结果
lis=sorted(zipped,key=lambda x:x[0])
#解压
res=zip(*lis)
a1,a2=[list(x) for x in res]
print(a1)
print(a2)
结果为:
[1, 5, 9]
[2, 6, 10]
其中,关于sorted(),见https://www.cnblogs.com/ZghzzZyu/p/15725034.html
场景描述2:获取二维数组(列表)的每一列
理解 zip()
与 二维数组,二维数组如:grid = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
,如果进行 'zip([1, 2, 3], [4, 5, 6], [7, 8, 9])',将结果转为列表后可以得到 [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
,很明显该列表中的每一个元组为二维数组 grid 的每一列。
因此可以直接先对二维数组进行 zip 解包:
>>>grid = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>>print([col for col in zip(*grid)])
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
场景描述3:旋转打印二维数组
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
点击查看代码
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
res = []
while matrix:
res += matrix.pop(0)
matrix = list(zip(*matrix))[::-1]
return res
通过应用 2 可知,zip(*matrix) 相当于把矩阵进行转置。