首先我们来了解一下zip()函数的语法。
语法
zip( *iterable)
参数
函数中的iterable参数可以是零个,一个或者多个迭代器。
它们可以是内置的如列表、字典、字符串,或者是用户自定义的迭代器。
返回值
zip()函数的工作原理是创建出一个迭代器,该迭代器可产出元组。
特别地,当传入zip的参数个数是0个是,zip()返回的是一个空的迭代器。
当传入一个参数时,zip()返回的元组迭代器产出的是只有一个元素的元组。传入多个参数的情况依此类推。
当我们编写程序时,有时我们想要迭代的元素包含在多个序列中。如下是一个关于zip()函数的简单用例:
示例一
注意观察传入参数个数变化
l1 = [1, 2, 3, 4, 5]
l2 = ['a', 'b', 'c', 'd', 'e']
for zero_par in zip(): #0个参数
print(zero_par, end=' ')
print('\n')
print('*' * 40)
for one_par in zip(l1): #1个参数
print(one_par, end=' ')
print('\n')
print('*' * 40)
for two_par in zip(l1, l2): #2个参数
print(two_par, end=' ')
结果如下所示:
示例二
前面说过zip()函数接受的参数是迭代器。如果传入了多个参数,那么zip()函数产出的元组中的元素分别来自每个迭代器。当输入的某一个迭代序列中没有元素可以继续迭代时,那么zip函数的整个迭代过程结束。即整个迭代的长度与传入的最短长度的序列的长度相同!
short = ['a', 'b', 'c', 'd']
long_ = ['A', 'B', 'C', 'D', 'E']
for a in zip(short, long_):
print(a)
输出结果:
当然,如果你不喜欢这种按最短的结束,你可以使用itertools模块中的zip_longest()函数来替代
from itertools import zip_longest
for a in zip_longest(short, long_):
print(a)
输出结果:
('a', 'A')
('b', 'B')
('c', 'C')
('d', 'D')
(None, 'E')
zip_longest()函数中的fillvalue参数默认为None, 可以改变它成你想要的值。如fillvalue = 1, 那么最后一项输出就是(1, ‘E’).
应用
当我们有不同的数据需要匹配在一起时,使用zip()函数是一个很好的选择。
假设你是一名老师,你需要把学生的姓名和成绩相对应,两种数据如下所示
names = ["Tom", "Jerry", "Jelly He", "Ben"]
scores = [100, 87, "failed", 92]
for name, score in zip(names, scores):
print("{} : {}".format(name, score))
输出结果:
Tom : 100
Jerry : 87
Jelly He : failed
Ben : 92
在Python3中,zip()函数返回的是一个迭代器。虽然循环输出让它看起来很像一个保存元组的列表,但如果想要保存数据为列表,要使用list()函数。
a = zip(names, scores)
print(a)
s = list(zip(names, scores))
print(s)
结果如下:
或者,你想讲这两组数据形成索引的关系,那么你可以使用如下这段代码将他们保存为一个字典。
s = dict(zip(names, scores))
print(s)
结果:{'Tom': 100, 'Jerry': 87, 'Jelly He': 'cheat', 'Ben': 92}