Python中的 enumerate和zip详情


Posted in Python onMay 30, 2022

前言

我们在上一期学习了关于Python 迭代器Iterator详情相关的概念,满足迭代器需要符合两个条件

  • 实现__iter__()方法:返回迭代器本省
  • 实现__next__()方法:返回迭代器的下一项

同时,Python中提供数据类型如列表、字典、元组等序列是可迭代对象,可结合for...in 来进行遍历为使我们的代码更加高效且优雅,Python也提供两个关于迭代的方法。因此,本期我们来学习enumerate函数和zip函数的相关使用方法,Let's go~~

1. enumerate 方法

我们在上述了解了迭代器的相关的知识点,对于可迭代对象列表、字典等可以使用for...in来进行快速遍历。例如对序列items使用for循环进行如下遍历,不用进行计算长度多余步骤。

for item in items:

但是,如上的遍历无法知道items序列每一个元素的索引,如果实际场景中,需要使用元素的索引呢?通常,我们会创建一个变量index,来记录元素的索引位置

index = 0
for item in items:
    # options
    index += 1

虽然上述方式可以解决我们的需求,但是代码显示非常的冗余,不符合pythonic的规范

在Pythonic要求中,我们可以使用enumerate()函数来替代上述实现方法

for index,item in enumerate(items):
    # options
    ...
  • enumerate()函数返回是一个enumerate对象实例,它是一个迭代器。
  • enumerate对象返回是连续包含一个由计数和值组成的元组(index,value)
  • 元组中value值通过传入序列上调用的**next()**返回的

但是,当序列中的元素是元组类型时,在使用enumerate()函数时,需要对value进行严格区分。

data = [(1,2),(3,4),(5,6),(7,8)]
# correct
for index,(x,y) in enumerate(data):
    ...
# Error
for index,x,y in enumerate(data):
    ...

Python中的 enumerate和zip详情

2. zip 方法

enumerate()函数时针对单个序列遍历处理。zip则是针对需要处理两个及以上的序列遍历处理。

zip 处理的是多对象迭代的,比如要同时迭代两列表name,age。按照传统思路只能使用下标遍历的方式,对于迭代器则运用不上。

但是使用下标遍历的方式,会有两个问题:

  • 代码冗余,可读性差,并且不够PythonIC
  • 如果两个容器的列表长度不一样时,则会需要增加额外代码来维护

Python 提供zip()函数可以解决以上两问题。

names = ["bone","anne","tom","tony"]
ages = [12,16,19]
for name,age in zip(names,ages):
    print(name,age)
...
bone 12
anne 16
tom 19
...

zip(x,y)会自动返回一个元组(a,b)的迭代器,其中x来自a,y来自b。当某个序列到结尾了,迭代也会随之结束。迭代长度跟参数中最短序列长度一致。

names = ["bone","anne","tom","tony"]
ages = [12,16,19]
for stu in zip(names,ages):
    print(stu)
...
('bone', 12)
('anne', 16)
('tom', 19)
...

当然,如果要以长度最长的列表为一致时,我们可以选择 iterators.zip_longset() 函数来代替。

from itertools import zip_longest
for stu in zip_longest(names,ages):
    print(stu)
...
('bone', 12)
('anne', 16)
('tom', 19)
('tony', None)
...

同时,使用zip()函数可以方便对两列表打包生成字典:

s = dict(zip(names,ages))
print(s)
...
{'bone': 12, 'anne': 16, 'tom': 19}
...

zip()会创建一个迭代器来作为结果返回的。如果将结果需要存储在列表中,则需要list()进行转换

print(list(zip(names,ages)))

...
[('bone', 12), ('anne', 16), ('tom', 19)]
...

总结

本期对Python针对序列遍历符合PythonIC的两种方法 enumerate函数和zip函数enumerate函数可以方便处理索引问题,zip函数处理多对象迭代场景。

到此这篇关于Python中的 enumerate和zip的文章就介绍到这了!


Tags in this post...

Python 相关文章推荐
python实现给字典添加条目的方法
Sep 25 Python
Python调用命令行进度条的方法
May 05 Python
python实现的AES双向对称加密解密与用法分析
May 02 Python
Python实现的中国剩余定理算法示例
Aug 05 Python
Python实现简单网页图片抓取完整代码实例
Dec 15 Python
python实现将excel文件转化成CSV格式
Mar 22 Python
Django网络框架之HelloDjango项目创建教程
Jun 06 Python
浅析PEP570新语法: 只接受位置参数
Oct 15 Python
基于python-pptx库中文文档及使用详解
Feb 14 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
Mar 04 Python
Python可变集合和不可变集合的构造方法大全
Dec 06 Python
Python实现文字pdf转换图片pdf效果
Apr 03 Python
python如何为list实现find方法
May 30 #Python
python实现商品进销存管理系统
May 30 #Python
python如何查找列表中元素的位置
May 30 #Python
Python数组变形的几种实现方法
May 30 #Python
Python Matplotlib绘制动画的代码详解
关于pytest结合csv模块实现csv格式的数据驱动问题
May 30 #Python
Python中的协程(Coroutine)操作模块(greenlet、gevent)
May 30 #Python
You might like
php正则表达式(regar expression)
2011/09/10 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
使用正则去除php代码中的注释方法
2016/11/03 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
3Z版基于jquery的图片复选框(asp.net+jquery)
2010/04/12 Javascript
jquery一般方法介绍 入门参考
2011/06/21 Javascript
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
javascript中如何处理引号编码"
2013/08/15 Javascript
js写的评论分页(还不错)
2013/12/23 Javascript
JavaScript 学习笔记之变量及其作用域
2015/01/14 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
利用jqgrid实现上移下移单元格功能
2018/11/07 Javascript
[01:20:05]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第二场 2月5日
2021/03/11 DOTA
python 循环遍历字典元素的简单方法
2016/09/11 Python
python使用jieba实现中文分词去停用词方法示例
2018/03/11 Python
Python银行系统实战源码
2019/10/25 Python
python selenium循环登陆网站的实现
2019/11/04 Python
Python loguru日志库之高效输出控制台日志和日志记录
2020/03/07 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
python交互模式基础知识点学习
2020/06/18 Python
详解HTML5中的picture元素响应式处理图片
2018/01/03 HTML / CSS
实习护理工作自我评价
2013/09/25 职场文书
普通大学毕业生自荐信
2013/11/04 职场文书
积极贯彻学习两会精神总结
2014/03/17 职场文书
《称象》教学反思
2014/04/25 职场文书
八一建军节演讲稿
2014/09/10 职场文书
2014优秀大学生简历自我评价
2014/09/15 职场文书
检讨书怎么写
2015/05/07 职场文书
十七岁的单车观后感
2015/06/12 职场文书
如何拟写通知正文?
2019/04/02 职场文书
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS
基于Python实现股票收益率分析
2022/04/02 Python