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中利用Pandas库处理大数据的简单介绍
Apr 07 Python
Python中的深拷贝和浅拷贝详解
Jun 03 Python
python下如何查询CS反恐精英的服务器信息
Jan 17 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
Aug 25 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
Oct 14 Python
python 对给定可迭代集合统计出现频率,并排序的方法
Oct 18 Python
解决Pycharm后台indexing导致不能run的问题
Jun 27 Python
python的pytest框架之命令行参数详解(下)
Jun 27 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
Sep 02 Python
opencv3/C++ 平面对象识别&透视变换方式
Dec 11 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
Apr 23 Python
使用Python文件读写,自定义分隔符(custom delimiter)
Jul 05 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结合飞信 免费天气预报短信
2009/05/07 PHP
Aster vs Newbee BO3 第二场2.18
2021/03/10 DOTA
JavaScript中几个重要的属性(this、constructor、prototype)介绍
2013/05/19 Javascript
javascript实现检验的各种规则
2015/07/31 Javascript
JS实现仿苹果底部任务栏菜单效果代码
2015/08/28 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
javascript中获取元素标签中间的内容的实现方法
2016/10/08 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
2016/10/26 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
js实现日历与定时器
2017/02/22 Javascript
实现微信小程序的wxml文件和wxss文件在webstrom的支持
2017/06/12 Javascript
JavaScript分步实现一个出生日期的正则表达式
2018/03/22 Javascript
JavaScript JMap类定义与使用方法示例
2019/01/22 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
2019/01/25 Javascript
浅谈js中的bind
2019/03/18 Javascript
js实现选项卡效果
2020/03/07 Javascript
[02:20]DOTA2亚洲邀请赛 IG战队出场宣传片
2015/02/07 DOTA
python自动化测试之setUp与tearDown实例
2014/09/28 Python
Linux下Python获取IP地址的代码
2014/11/30 Python
python实现数独算法实例
2015/06/09 Python
python数据分析数据标准化及离散化详解
2018/02/26 Python
Python基于pandas实现json格式转换成dataframe的方法
2018/06/22 Python
python实现flappy bird游戏
2018/12/24 Python
Python基础学习之函数方法实例详解
2019/06/18 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
pyecharts动态轨迹图的实现示例
2020/04/17 Python
哪些是python中web开发框架
2020/06/17 Python
Sperry官网:帆船鞋创始品牌
2016/09/07 全球购物
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
本科毕业生求职自荐信
2014/04/09 职场文书
社区党建工作汇报材料
2014/10/27 职场文书
2019年新郎保证书3篇
2019/10/17 职场文书
VUE中的v-if与v-show区别介绍
2022/03/13 Vue.js
实战Python爬虫爬取酷我音乐
2022/04/11 Python