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字符类型的一些方法小结
May 16 Python
windows上安装Anaconda和python的教程详解
Mar 28 Python
使用python根据端口号关闭进程的方法
Nov 06 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
Apr 29 Python
20行python代码实现人脸识别
May 05 Python
PyQt5 QTableView设置某一列不可编辑的方法
Jun 25 Python
python导包的几种方法(自定义包的生成以及导入详解)
Jul 15 Python
Django模型中字段属性choice使用说明
Mar 30 Python
python中shell执行知识点
May 06 Python
python爬虫用request库处理cookie的实例讲解
Feb 20 Python
详解pandas apply 并行处理的几种方法
Feb 24 Python
python中的plt.cm.Paired用法说明
May 31 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 将字符串按大写字母分隔成字符串数组
2010/04/30 PHP
php中通过正则表达式下载内容中的远程图片的函数代码
2012/01/10 PHP
一个好用的PHP验证码类实例分享
2013/12/27 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
JavaScript 判断浏览器是否支持SVG的代码
2013/03/21 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
jquery操作checkbox实现全选和取消全选
2014/05/02 Javascript
基于JavaScript代码实现随机漂浮图片广告
2016/01/05 Javascript
实现React单页应用的方法详解
2016/08/02 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
2016/12/08 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
2017/06/22 Javascript
Vue之Watcher源码解析(2)
2017/07/19 Javascript
浅谈Vue的加载顺序探讨
2017/10/25 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
Vue项目查看当前使用的elementUI版本的方法
2018/09/27 Javascript
swiper4实现移动端导航栏tab滑动切换
2020/10/16 Javascript
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
python写的ARP攻击代码实例
2014/06/04 Python
python写入文件自动换行问题的方法
2019/07/05 Python
Python基于WordCloud制作词云图
2019/11/29 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
2020/06/10 Python
详解Python 函数参数的拆解
2020/09/02 Python
python实现简单的tcp 文件下载
2020/09/16 Python
Python使用grequests并发发送请求的示例
2020/11/05 Python
HTML5 Canvas——用路径描画线条实例介绍
2013/06/09 HTML / CSS
整理HTML5的一些新特性与Canvas的常用属性
2016/01/29 HTML / CSS
HTML5不支持frameset的两种解决方法
2016/11/14 HTML / CSS
佳能法国商店:Canon法国
2019/02/14 全球购物
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
.NET面试10题
2014/02/24 面试题
我有一个梦想演讲稿
2014/05/05 职场文书
大学应届毕业生求职信
2014/05/24 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
单位工作证明
2014/10/07 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书