Effective Python 小笔记之 zip 函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Effective Python 小笔记之 zip 函数相关的知识,希望对你有一定的参考价值。
环境: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 函数。
以上是关于Effective Python 小笔记之 zip 函数的主要内容,如果未能解决你的问题,请参考以下文章