目录
一、zip函数的作用
zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的zip对象。(请注意:Python3中返回的是zip对象,python2 中返回的是这些元组组成的列表)
使用zip()函数打包的好处是节约了不少的内存。
import sys
empty = []
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9, 10, 11, 12, 13]
print(sys.getsizeof(empty)) # 56字节
print(sys.getsizeof(a)) # 88字节
print(sys.getsizeof(b)) # 88字节
print(sys.getsizeof(c)) # 120字节
ab1 = a + b
print(sys.getsizeof(ab1)) # 104字节
ab2 = zip(a, b)
print(sys.getsizeof(ab2)) # 64字节
二、用法
zip()函数的语法格式: zip(iterables……)
1.只有一个参数的情况
a = [1,2,3]
a1 = zip(a)
a2 = list(zip(a))
print(a1, a2, sep="\n")
# 输出
# <zip object at 0x10bc3c940>
# [(1,), (2,), (3,)]
2.两个或多个参数的情况
a = [1,2,3]
b = [4,5,6]
ab1=zip(a ,b)
ab2 = list(zip(a, b))
print(ab1, ab2, sep="\n")
# 输出
# <zip object at 0x105184940>
# [(1, 4), (2, 5), (3, 6)]
3.参数长度不同的情况
a = [1,2]
b = [4,5,6]
ab1=zip(a ,b)
ab2 = list(zip(a, b))
print(ab1, ab2, sep="\n")
# 输出
# <zip object at 0x10a590c40>
# [(1, 4), (2, 5)]
三、实际应用
1.将两个列表转换成字典
a = [1,2,3]
b = [4,5,6]
ab = dict(zip(a, b))
print(ab)
# 输出
# {1: 4, 2: 5, 3: 6}
2.用于实现矩阵的加减、点乘、转置等操作
m=[[1,1],[4,5]]
n=[[1,2],[2,3]]
for a,b in zip(m,n):
for x,y in zip(a,b):
print(x+y)
# 矩阵相加!同样根据矩阵其他的运算规则用zip可以实现更多矩阵的操作
# 输出
# 2
# 4
# 6
# 8
四、解压 zip(*iterables)
zip(*iterables)中的 *iterables参数,可以list数组,也可以是zip()函数返回的对象。
a = [1,2,3]
b = [4,5,6]
ab = zip(a, b)
print('解压前', list(ab), sep="\n")
ab = zip(a, b) # 重新压缩
print('解压后', list(zip(*ab)), sep="\n")
# 输出
# 解压前
# [(1, 4), (2, 5), (3, 6)]
# 解压后
# [(1, 2, 3), (4, 5, 6)]
如上示例,可以看到经过解压之后,恢复了两个列表最初的元素,只是类型不同了,如果需要可以再进行类型转化。
值得注意的是,如上示例多写了一行 ‘重新压缩’,这是因为zip返回的对象是一个迭代器,第一次使用完,第二次会变成空列表,这个需要特别注意!
a = [1,2,3]
b = [4,5,6]
ab = zip(a, b)
print('解压前', list(ab), sep="\n")
# ab = zip(a, b) # 重新压缩
print('解压后', list(zip(*ab)), sep="\n")
# 输出
# 解压前
# [(1, 4), (2, 5), (3, 6)]
# 解压后
# []
五、*zip( )
*zip()是zip()的逆过程,将zip对象变成原先组合前的数据。
a=[[1,2,3],[4,5,6],[7,8,9]]
print(list(zip(*a)))
# 输出
# [(1,4,7),(2,5,8),(3,6,9)] #实现了矩阵转置的功能,但由于返回列表的元素是元组,要进一步转换
print(list(map(list,zip(*a))))
# 输出
#[[1,4,7],[2,5,8],[3,6,9]] #元组转换为列表
#----------------
a=[1,4,7]
b=[2,5,8]
c=[3,6,9]
print(list(zip(*zip(a,b,c))))
# 输出
# [(1,4,7),(2,5,8),(3,6,9)]