环境:Python 3.5.1
CentOS 7
zip函数可以同时遍历两个迭代器。
在编写Python代码时,通常要面对很多列表,而这些列表中的对象,可能是相互关联的。如下例:
names = [‘Cecilia‘, ‘Lily‘, ‘Maria‘] length = [len(word) for word in names]
对于上例中的源列表和派生列表,相同索引处有关联关系,以此再引申出一个例子:
longest_name = None max_length = 0 for i in range(len(names)): count = length[i] if count > max_length: longest_name = names[i] max_length = count print(longest_name) >>> Cecilia
以上代码的问题在于,整个循环语句看起来很乱。使用下标来访问names和length会使代码不易阅读。改用enumerate,可以稍稍缓解这个问题,但仍不理想。
for i, name in enumerate(names): count = length[i] if count > max_length: longest_name = name max_length = count
使用Python内置zip函数,能使上述代码变得简洁。在Python 3 中的zip函数,可以把两个或两个以上的迭代器封装成生成器。这种zip生成器,会从每个迭代器中获取该迭代器的下一个值,然后将这些值汇聚成元组(tuple)。
for name, count in zip(names, length): if count > max_length: longest_name = name max_length = count
另,Python 3内置的zip函数有一个问题,如果输入的迭代器长度不同,zip会表现的很奇怪。例如,当给names添加一个名字,但没有更新length。现在,如果使用zip同时遍历这两个列表,会产生意外的结果。
names.append(‘Song‘) for name, count in zip(names, length): print(name) >>> Cecilia Lily Maria
新元素‘song’并没有出现在遍历结果中。受封装的那些迭代器中,只要一个耗尽, zip 将不再产生元组。若待遍历的迭代器长度不同,那么 zip 会提前终止。若不能确定 zip 封装的列表是否等长,则可考虑使用 itertools 内置模块中的 zip_longest 函数。
原文地址:http://jaydenwen.blog.51cto.com/8079623/1775017