美文网首页
Effective Python(11): 用zip函数同时遍历

Effective Python(11): 用zip函数同时遍历

作者: warmsirius | 来源:发表于2019-10-11 22:14 被阅读0次

一、前言

对于某些列表来说,列表间的相同索引处的元素关联,如果想平行地迭代这几份列表,可以使用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

三、总结

    1. 内置的zip函数可以平行地遍历多个迭代器
    1. Python3中的zip相当于生成器,会在遍历过程中逐次产生元组,而Python2中的zip则是直接把这些元组完全生成好,并一次性地返回整份列表
    1. 如果提供的迭代器长度不等,那么zip会自动提前终止
    1. itertools内置模块中的zip_longest函数可以平行地遍历多个迭代器,而不用在乎他们的长度是否相等

相关文章

网友评论

      本文标题:Effective Python(11): 用zip函数同时遍历

      本文链接:https://www.haomeiwen.com/subject/ltjspctx.html