zip函数,看的话都应该认识这是压缩的意思,但是怎么用呐?
zip是用来压缩的,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表),或是dict(字典)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。直接用代码做示例吧
a = [1, 2, 3]
b = ['a', 'b', 'c']
c = dict(zip(a, b))
d = list(zip(a, b))
他们的输出分别是
{
1: 'a', 2: 'b', 3: 'c'}
[(1, 'a'), (2, 'b'), (3, 'c')]
但是字典压缩的内容只能是两个,列表却可以很多
a = [1, 2, 3]
b = ['a', 'b', 'c']
c = ['x', 'y', 'z']
d = list(zip(a, b, c))
输出
[(1, 'a', 'x'), (2, 'b', 'y'), (3, 'c', 'z')]
如果转为列表就会报错
转换时是以最短的为主,如下面的
a = [1, 2, 3, 4]
b = ['a', 'b', 'c']
d = list(zip(a, b))
他的输出仍然是
[(1, 'a'), (2, 'b'), (3, 'c')]
有了压缩,肯定少不了解压缩,在python中,对zip函数的解压缩就是*zip函数,解压缩并非时返回原来的两个列表,而是返回一个列表,之前的内容被定义为元组类型
a = [1, 2, 3]
b = ['a', 'b', 'c']
c = ['x', 'y', 'z']
d = list(zip(a, b, c))
print(list(zip(*d)))
输出结果就会时
[(1, 2, 3), ('a', 'b', 'c'), ('x', 'y', 'z')]
转化时并不能让他输出为字典,因为本来就不是字典
zip函数在实际上也是十分好用的,就比如矩阵中
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
对他进行矩阵的行列互换,的确用迭代的方法也可以
print [ [row[col] for row in a] for col in range(len(a[0]))]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
但是我们如果用zip函数的话就更简单了
x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
zip(*x)
输出结果为
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
此时再用map函数转化为列表既可以
map(list,zip(*a))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
在力扣中做题时,zip函数也可以省不少力气
例如:https://blog.csdn.net/qq_51718832/article/details/109340822