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局域网ip扫描示例分享
Apr 03 Python
利用python程序帮大家清理windows垃圾
Jan 15 Python
python 如何快速找出两个电子表中数据的差异
May 26 Python
解决python3读取Python2存储的pickle文件问题
Oct 25 Python
Django框架登录加上验证码校验实现验证功能示例
May 23 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
Jun 21 Python
Python爬虫之urllib基础用法教程
Oct 12 Python
将python安装信息加入注册表的示例
Nov 20 Python
利用python制作拼图小游戏的全过程
Dec 04 Python
M1芯片安装python3.9.1的实现
Feb 02 Python
python Polars库的使用简介
Apr 21 Python
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
Apr 21 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中取得image按钮传递的name值
2006/10/09 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
javascript之水平横向滚动歌词同步的应用
2007/05/07 Javascript
jQuery 打造动态下滑菜单实现说明
2010/04/15 Javascript
js中判断控件是否存在
2010/08/25 Javascript
Jquery倒数计时按钮setTimeout的实例代码
2013/07/04 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
jQuery延迟加载图片插件Lazy Load使用指南
2015/03/25 Javascript
javascript中使用new与不使用实例化对象的区别
2015/06/22 Javascript
readonly和disabled属性的区别
2015/07/26 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
JavaScript数组去重的两种方法推荐
2016/04/05 Javascript
bootstrap输入框组代码分享
2016/06/07 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
jQuery点击导航栏选中更换样式的实现代码
2017/01/23 Javascript
js实现百度登录框鼠标拖拽效果
2017/03/07 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
通过vue-cli来学习修改Webpack多环境配置和发布问题
2017/12/22 Javascript
vue项目中使用scss的方法步骤
2019/05/16 Javascript
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
基于Vue全局组件与局部组件的区别说明
2020/08/11 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
2020/10/30 Javascript
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
2018/05/08 Python
python opencv如何实现图片绘制
2020/01/19 Python
python matplotlib 绘图 和 dpi对应关系详解
2020/03/14 Python
英国最好的包装供应商:Priory Direct
2019/12/17 全球购物
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
2019年Java面试必问之经典试题
2012/09/12 面试题
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
电子信息毕业生自荐信
2013/11/16 职场文书
高考作弊检讨书1500字
2015/02/16 职场文书
大学生英文求职信范文
2015/03/19 职场文书
离婚纠纷代理词
2015/05/23 职场文书
聊聊Lombok中的@Builder注解使用教程
2021/11/17 Java/Android