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操作RabbitMQ服务器消息队列的远程结果返回
Jun 30 Python
Django模板变量如何传递给外部js调用的方法小结
Jul 24 Python
Python实现多属性排序的方法
Dec 05 Python
Django REST framework视图的用法
Jan 16 Python
python实现控制COM口的示例
Jul 03 Python
Python 分享10个PyCharm技巧
Jul 13 Python
利用ImageAI库只需几行python代码实现目标检测
Aug 09 Python
django框架基于queryset和双下划线的跨表查询操作详解
Dec 11 Python
Python连接字符串过程详解
Jan 06 Python
Python函数式编程实例详解
Jan 17 Python
jupyter notebook tensorflow打印device信息实例
Apr 20 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
Jan 12 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
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
2014/06/21 Servers
CI框架中site_url()和base_url()的区别
2015/01/07 PHP
js中将URL中的参数提取出来作为对象的实现代码
2011/08/16 Javascript
框架页面高度自动刷新的Javascript脚本
2013/11/01 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
深入理解javascript中defer的作用
2013/12/11 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
jQuery基本选择器(实例及表单域value的获取方法)
2016/05/20 Javascript
js 连续赋值的简单实现
2016/06/13 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
input框中的name和id的区别
2016/11/16 Javascript
jQuery 防止相同的事件快速重复触发方法
2018/02/08 jQuery
JS基于开关思想实现的数组去重功能【案例】
2019/02/18 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
2019/09/21 Javascript
JavaScript设计模式之策略模式实现原理详解
2020/05/29 Javascript
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
python入门教程之识别验证码
2017/03/04 Python
Python中is和==的区别详解
2018/11/15 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
Pandas库之DataFrame使用的学习笔记
2019/06/21 Python
python实现TCP文件传输
2020/03/20 Python
keras得到每层的系数方式
2020/06/15 Python
Django+Uwsgi+Nginx如何实现生产环境部署
2020/07/31 Python
python实现每天自动签到领积分的示例代码
2020/08/18 Python
python音频处理的示例详解
2020/12/23 Python
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
html5使用canvas绘制文字特效
2014/12/15 HTML / CSS
中职应届生会计求职信
2013/10/23 职场文书
煤矿安全承诺书
2014/05/22 职场文书
应届硕士毕业生自荐信
2014/05/26 职场文书
2014年教育培训工作总结
2014/12/08 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
2015年机关党建工作总结
2015/05/22 职场文书
MySQL 数据丢失排查案例
2021/05/08 MySQL