一、前言
对于某些列表来说,列表间的相同索引处的元素关联,如果想平行地迭代这几份列表,可以使用zip
函数来进行迭代。
二、zip
函数
1. 基本用法
python3中内置的zip
函数可以把两个或两个以上的迭代器封装为生成器,以便稍后求值。
zip
生成器,会从每个迭代器中获取该迭代器的下一个值,然后把这些值汇聚成元组。
names = ["jack", "rose", "david"]
age = [12, 40, 28]
for name, age in zip(names, age):
print("name: {}, age: {}".format(name, age))
# 输出
name: jack, age: 12
name: rose, age: 40
name: david, age: 28
2. zip
函数可能存在的两个问题
2.1 python2中的zip
并不是生成器
- python2中的
zip
并不是生成器,而是会把开发者所提供的迭代器,都平行地迭代一次- 在此过程中,它都会把那些迭代器所产生的值汇聚成元组,并把那些元组所构成的列表完整地返回给调用者。
Python2的
zip
方法可能会占用大量内存并导致程序崩溃。
2.2 迭代器长度不一致,按最短的结束迭代
- 受封装的迭代器中只要有一个耗尽,zip就不再产生元组了。
names = ["jack", "rose", "david", "sara"]
age = [12, 40, 28]
for name, age in zip(names, age):
print("name: {}, age: {}".format(name, age))
# 输出
name: jack, age: 12
name: rose, age: 40
name: david, age: 28
- 如果不确定
zip
所封装的列表是否相等,考虑itertools.zip_longest
函数
from itertools import zip_longest
names = ["jack", "rose", "david", "sara"]
age = [12, 40, 28]
for name, age in zip_longest(names, age):
print("name: {}, age: {}".format(name, age))
# 输出
name: jack, age: 12
name: rose, age: 40
name: david, age: 28
name: sara, age: None
三、总结
- 内置的
zip
函数可以平行地遍历多个迭代器
- 内置的
- Python3中的
zip
相当于生成器,会在遍历过程中逐次产生元组,而Python2中的zip则是直接把这些元组完全生成好,并一次性地返回整份列表
- Python3中的
- 如果提供的迭代器长度不等,那么
zip
会自动提前终止
- 如果提供的迭代器长度不等,那么
-
itertools
内置模块中的zip_longest
函数可以平行地遍历多个迭代器,而不用在乎他们的长度是否相等
-
网友评论