在, zip()是一个功能强大的内置函数, 它用于在多个可迭代对象里按索引位置把元素组合成元组, 进而形成新的迭代器。其常用于配对、合并、并行遍历等操作, 是处理多个数据序列的有效工具。
zip() 此名字栩栩如生地阐明了其功能所在, 即把多个序列予以“咬合”, 使其如同拉链按项进行配对那般 , 其功能就如同拉链按项配对那样 , 将多个序列“咬合”在一起。
一、函数语法
zip(iterable1, iterable2, ..., iterableN)参数:
, 一个或者多个可继续迭代的对象, 像列表, 元组, 字符串或者range之内, 如果个数随意不限定, 然而最终结果之中仅仅保留最短可迭代对象长度相对应的那些元素。
返回值:
给出这么一个对象,它属于迭代器类别, 具体是zip类型, 其中每一元素, 皆为由传入诸个可迭代物内, 拥有相同索引数编号的成分所搭建起来的元组句号。
若要去查看全部的结果, 能够使用 list(), 或者 tuple(), 从而将其转变为列表或者元组。
二、基础用法示例
1、将两个列表打包成对
names = ['Alice', 'Bob', 'Charlie'] scores = [90, 85, 78] for name, score in zip(names, scores): print(f"{name}: {score}")输出:
Alice: 90 Bob: 85 Charlie: 782、运行zip() , 它会返回zip 对象, 要查看结果, 就得将其转换为列表或者元组。
a = [1, 2, 3] b = ['a', 'b', 'c'] z = zip(a, b) print(list(z)) # 输出: [(1, 'a'), (2, 'b'), (3, 'c')]3、多个可迭代对象
a = [1, 2, 3] b = ['a', 'b', 'c'] c = ['x', 'y', 'z'] print(list(zip(a, b, c))) # 输出:[(1, 'a', 'x'), (2, 'b', 'y'), (3, 'c', 'z')]4、 长度不一致时,按最短截断
a = [1, 2, 3] b = ['a', 'b'] print(list(zip(a, b))) # 输出:[(1, 'a'), (2, 'b')] # 第 3 个元素被舍弃三、典型应用场景
1、构建字典
keys = ['id', 'name', 'age'] values = [101, 'Alice', 18] person = dict(zip(keys, values)) print(person) # 输出:{'id': 101, 'name': 'Alice', 'age': 18}2、并行遍历多个序列
students = ['Tom', 'Jerry', 'Spike'] scores = [88, 92, 75] for name, score in zip(students, scores): print(f"{name}: {score}")输出:
Tom: 88 Jerry: 92 Spike: 753、解包(逆操作)
使用 * 运算符可以解包已 zip 的数据。
zipped = [('Alice', 25), ('Bob', 30), ('Charlie', 35)] names, ages = zip(*zipped) print(names) # 输出: ('Alice', 'Bob', 'Charlie') print(ages) # 输出: (25, 30, 35)“*”, 这是解包操作符, 它发挥的作用是, 把其中的每一项, 都单独地取出来, 以此作为参数, 传入到函数之中。
4、转置()二维列表
matrix = [ [1, 2, 3], [4, 5, 6] ] transposed = list(zip(*matrix)) print(transposed) # 输出:列表的行列互换 # [(1, 4), (2, 5), (3, 6)]四、补充说明
1、zip() 功能是, 返回那种惰性迭代器, 它不会马上就生成全部所得, 而是当进行遍历操作的时候,才会逐一去做计算, 这种情况是适宜用于大数据处理工作当中的。
即,zip() 返回的是迭代器,只能被消费一次。
zipped = zip(names, ages) list(zipped) # 第一次可以正常使用 list(zipped) # 第二次返回空列表2、若想要进行强制的“等长配对”操作, 得以使用.( ),此操作会对较短列表的那些缺失值予以填补, 但这是需要引入标准库才行的。
from itertools import zip_longest a = [1, 2] b = ['a', 'b', 'c'] print(list(zip_longest(a, b, fillvalue='-'))) # 输出:[(1, 'a'), (2, 'b'), ('-', 'c')]3、zip() 可与 () 配合使用。
names = ['Tom', 'Jerry', 'Spike'] scores = [88, 92, 75] for i, (n, s) in enumerate(zip(names, scores), start=1): print(f"第{i}位:{n}({s}分)")4、在 2 中,zip() 直接返回列表而非迭代器。
5、处理大型数据集之际, zip() 相较手动索引, 效率更高, 且更具某种况味。
并行迭代处理当中,有个强大工具名叫zip(), 它能让代码更简洁, 也能让代码更易读, 在需要同时去处理多个相关数据流序列的场景里,它特别适用。