这里是Sapphire_CDD,这是本人的第一篇博客
参考了CSDN上的一些文章,都没有发现将zip函数的各类使用方法总结起来的博客,所以做了个总结,如有问题请在评论区指正,如果对你有帮助,欢迎点一个赞~
# zip([iterable, …]) 参数为一个或多个迭代器
# 0. 只有一个参数的时候,将列表打包成元组
# 在python2中zip函数返回元组,但在python3中zip函数返回该方法的地址,所以需要类型转换
lst0 = [1, 3, 4]
print(tuple(zip(lst0)))
print(list(zip(lst0)))
print()
# 1. zip()函数将可迭代对象打包,节约内存
# 2. zip()函数把多个迭代对象中同地位的数据以元组的形式放在同一块存储空间,多余的会被舍弃
import sys
lst = []
a = [1, 2, 3]
b = [4, 5, 6, 7, 8]
print("lst所占字节为:", sys.getsizeof(lst))
print("a所占字节为:", sys.getsizeof(a))
print("b所占字节为:", sys.getsizeof(b))
lst1 = a + b
print("普通的列表a+b所占字节为:", sys.getsizeof(lst1))
print("a+b:", lst1)
lst2 = list(zip(a, b)) # 注意,python2中zip函数的返回值是列表,python3中是这个函数的地址
print("用zip函数打包后所占字节数为:", sys.getsizeof(lst2))
print("zip打包:", lst2) # 可以看到zip函数是把多个迭代器中同地位的数据放到一起,多出来的舍弃
print()
# 嵌套列表的压缩
m = [[1, 2, 3], [4, 5, 6]]
n = [[2, 2, 2], [3, 3, 3]]
p = [[9, 9, 9]]
print("列表中嵌套列表的打包:", list(zip(m, n)))
# 同样的,如果列表的列数不同,多余的也会被舍弃
print("如果列数不同,同理:", list(zip(m, p)))
print()
# 3. zip*()函数用于解压(像指针的解引用)
a = [1, 2, 3]
b = [4, 5, 6]
lst3 = zip(a, b) # 返回函数地址
c, d = zip(*lst3)
print("解压a:", c)
print("解压b:", d)
# 当然也可以直接解引用列表元素
lst = [(1, 5, 9), (2, 4, 8)]
a, b, c = zip(*lst)
print("解压a:", a)
print("解压b:", b)
print("解压c:", c)
print()
# 4. *zip()函数:打包后返回一个元组
a = [1, 2, 3]
b = [4, 5, 6]
print(list(zip(a, b)))
print(*zip(a, b))
print()
# 实例:实现矩阵行列互换
# zip()和zip(*)都能用于二维列表行列互换
# 但zip(*)只用带一个参数,就是矩阵本身
mat = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(mat)
mat1 = list(zip(mat)) # 只有一个参数,可以看作zip(mat,[])
mat2 = list(zip(*mat)) # 所以逆置要用zip(*)
print(mat1)
print(mat2)
print()