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 mysqldb连接数据库
Mar 16 Python
小米5s微信跳一跳小程序python源码
Jan 08 Python
python在非root权限下的安装方法
Jan 23 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
Nov 16 Python
用Python画一个LinkinPark的logo代码实例
Sep 10 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
Dec 09 Python
python 线性回归分析模型检验标准--拟合优度详解
Feb 24 Python
python修改linux中文件(文件夹)的权限属性操作
Mar 05 Python
django中的数据库迁移的实现
Mar 16 Python
pycharm 添加解释器的方法步骤
Aug 31 Python
上手简单,功能强大的Python爬虫框架——feapder
Apr 27 Python
Django路由层如何获取正确的url
Jul 15 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
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
CodeIgniter实现更改view文件夹路径的方法
2014/07/04 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
2015/03/05 PHP
php中array_multisort对多维数组排序的方法
2020/06/21 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
2014/02/21 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
windows下wxPython开发环境安装与配置方法
2014/06/28 Python
对于Python编程中一些重用与缩减的建议
2015/04/14 Python
python中assert用法实例分析
2015/04/30 Python
python SMTP实现发送带附件电子邮件
2018/05/22 Python
python操作excel的包(openpyxl、xlsxwriter)
2018/06/11 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
Python多线程获取返回值代码实例
2020/02/17 Python
解决django接口无法通过ip进行访问的问题
2020/03/27 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
室内设计专业个人的自我评价
2013/10/19 职场文书
高一自我鉴定
2013/12/17 职场文书
低碳环保口号
2014/06/12 职场文书
个人三严三实对照检查材料
2014/09/25 职场文书
邮政营业员岗位职责
2015/04/14 职场文书
关于成立领导小组的通知
2015/04/23 职场文书
初中重阳节活动总结
2015/05/05 职场文书
法律进社区活动总结
2015/05/07 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
幼儿园见习总结
2015/06/23 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
会计工作自我鉴定范文
2019/06/21 职场文书