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) 相当于把矩阵进行转置。

posted @ 2022-05-10 23:35  ZghzzZyu  阅读(533)  评论(0编辑  收藏  举报