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中使用CasperJS获取JS渲染生成的HTML内容的教程
Apr 09 Python
深入浅析Python字符编码
Nov 12 Python
python&MongoDB爬取图书馆借阅记录
Feb 05 Python
浅析AST抽象语法树及Python代码实现
Jun 06 Python
python常见的格式化输出小结
Dec 15 Python
python的构建工具setup.py的方法使用示例
Oct 23 Python
Python for循环生成列表的实例
Jun 15 Python
Pytorch之保存读取模型实例
Dec 30 Python
python安装读取grib库总结(推荐)
Jun 24 Python
Pycharm 解决自动格式化冲突的设置操作
Jan 15 Python
Python+Appium实现自动化清理微信僵尸好友的方法
Feb 04 Python
5道关于python基础 while循环练习题
Nov 27 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使用GETDATE获取当前日期时间作为一个关联数组的方法
2015/03/19 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
2010/03/04 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
2013/12/13 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
ExpressJS入门实例
2015/01/14 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
基于javascript实现单选及多选的向右和向左移动实例
2015/07/25 Javascript
Angular2+如何去除url中的#号详解
2017/12/20 Javascript
Nodejs实现用户注册功能
2019/04/14 NodeJs
[53:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第三场 6.2
2018/06/03 DOTA
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
Python的Django应用程序解决AJAX跨域访问问题的方法
2016/05/31 Python
Python3处理HTTP请求的实例
2018/05/10 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
2018/10/30 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
python中if及if-else如何使用
2020/06/02 Python
使用CSS3美化HTML表单的技巧演示
2016/05/17 HTML / CSS
德国著名廉价网上药店:Shop-Apotheke
2017/07/23 全球购物
ddl,dml和dcl的含义
2016/05/08 面试题
简述网络文件系统NFS,并说明其作用
2016/10/19 面试题
竞选演讲稿范文
2013/12/28 职场文书
广告学专业毕业生自荐信
2014/05/28 职场文书
电气工程及其自动化专业毕业生自荐信
2014/06/21 职场文书
本科毕业生应聘求职信
2014/07/06 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
三好学生主要事迹材料
2015/11/03 职场文书
幼儿教师师德培训心得体会
2016/01/09 职场文书
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server