前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python90-8 使用zip同时迭代多个迭代器

Python90-8 使用zip同时迭代多个迭代器

作者头像
一只大鸽子
发布2022-12-06 09:27:02
5700
发布2022-12-06 09:27:02
举报
文章被收录于专栏:Python基础、进阶与实战

第8条:使用zip同时迭代多个迭代器

Item 8: Use zip to Process Iterators in Parallel

Python中经常会和list打交道。例如从一个list中产生相关list(list comprehensions)。

代码语言:javascript
复制
names = ['Cecilia', 'Lise', 'Marie']
counts = [len(n) for n in names]
print(counts)
>>>
[7, 4, 5]

想遍历两个列表,可以使用range+index形式:

代码语言:javascript
复制
longest_name = None
max_count = 0
for i in range(len(names)):
    count = counts[i]
    if count > max_count:
        longest_name = names[i]
        max_count = count
print(longest_name)
>>>
Cecilia

显然这种方式太冗长,我们在Item 7中说过。考虑使用enumerate:

代码语言:javascript
复制
for i, name in enumerate(names):
    count = counts[i]
    if count > max_count:
        longest_name = name
        max_count = count

效果还是不够理想(索引方式在作者看来比较糟糕)。

为了让代码更干净,Pyhon提供了内置的zip函数。zip用一个惰性生成器来包装两个或更多迭代器。zip generator从迭代器中产生tuples。这些tuple可以在for中直接被解包。

代码语言:javascript
复制
for name, count in zip(names, counts):
    if count > max_count:
        longest_name = name
        max_count = count

但是,要注意当迭代器长度不同时,zip会产生意想不到的结果。例如,names增加了一个元素,但是counts没有相应增加:

代码语言:javascript
复制
names.append('Rosalind')
for name, count in zip(names, counts):
    print(name)
>>>
Cecilia
Lise
Marie

names中新加的'Rosalind'没有出现。这就是zip的工作方式(truncating),当较短的迭代器耗尽后,zip也就结束了。

如果你传递的迭代器长度不同,可以考虑zip_longest来替代zip。

代码语言:javascript
复制
import itertools
for name, count in itertools.zip_longest(names, counts):
    print(f'{name}: {count}')
>>>
Cecilia: 7
Lise: 4
Marie: 5
Rosalind: None

zip_longer会将缺失值替换为fillvalue,默认是None。

Things to Remember

  • • 内置的zip函数可用来并行迭代多个迭代器
  • • zip产生一个惰性迭代器,每次生成tuple,因此可以处理无限长的输入。
  • • zip会截断为最短的迭代器,如果迭代器长度不一样。
  • • itertools的zip_longest可以解决上面的截断行为。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一只大鸽子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第8条:使用zip同时迭代多个迭代器
  • Item 8: Use zip to Process Iterators in Parallel
    • Things to Remember
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档