【Python】内置函数zip()
制作一个迭代器,用于聚合来自每个迭代器的元素。
语法:
1 2 3 4 5 |
## 打包 zip([iterables],......) ## 解包 zip((*[iter(s)]) |
iterables,一个或多个迭代器
例1:打包
1 2 3 4 5 6 7 8 9 10 |
## 定义两个列表 >>> x = [1, 2, 3] >>> y = [4, 5, 6] ## 可以理解成将两个列表打包在一起 >>> zipped = zip(x, y) >>> ## 打包后的效果是列表元素,按照位置一一对应 >>> list(zipped) [(1, 4), (2, 5), (3, 6)] >>> |
例2:解包
1 2 3 4 5 6 7 8 9 |
>>> x = [1, 2, 3] >>> y = [4, 5, 6] >>> zipped = zip(x, y) >>> x2, y2 = zip(*zip(x, y)) >>> list(x2) [1, 2, 3] >>> list(y2) [4, 5, 6] >>> |
例3:在打包时,如果两个列表的元素个数不一致时会是什么效果呢?
1 2 3 4 5 6 |
>>> x = [1, 2, 3] >>> y = [4, 5, 6, 7, 8] >>> list(zip(x, y)) [(1, 4), (2, 5), (3, 6)] >>> ## 经测试,两个列表是按照元素位置进行打包配对的。 |
例4:多个列表打包
1 2 3 4 5 6 |
>>> x = [1, 2, 3] >>> y = [4, 5, 6, 7, 8] >>> z = ['a','b','c'] >>> list(zip(x, y, z)) [(1, 4, 'a'), (2, 5, 'b'), (3, 6, 'c')] >>> |
注:
zip()的结果只能使用一次,连续使用的第二次就已经是[]了,以例1为例效果如下:
1 2 3 4 5 6 7 8 |
>>> x = [1, 2, 3] >>> y = [4, 5, 6] >>> zipped = zip(x, y) >>> list(zipped) [(1, 4), (2, 5), (3, 6)] >>> list(zipped) [] >>> |
为什么第二次list时结果为[],开篇第一句已经说了,zip是制作一个迭代器,第一次使用list()时,已经完成了迭代器的遍历,第二次再次使用list()时,迭代器的遍历已经结束了。所以返回的是[]
如果想每次都有值,那么需要每次都打包,如下:
1 2 3 4 5 6 |
>>> list(zip(x, y)) [(1, 4), (2, 5), (3, 6)] >>> >>> list(zip(x, y)) [(1, 4), (2, 5), (3, 6)] >>> |