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爬虫之爬虫框架Scrapy安装配置
Nov 06 Python
python开发之for循环操作实例详解
Nov 12 Python
Python找出9个连续的空闲端口
Feb 01 Python
使用pandas的DataFrame的plot方法绘制图像的实例
May 24 Python
Python学习笔记之列表推导式实例分析
Aug 13 Python
python统计函数库scipy.stats的用法解析
Feb 25 Python
Python编程快速上手——选择性拷贝操作案例分析
Feb 28 Python
Python转换字典成为对象,可以用"."方式访问对象属性实例
May 11 Python
DjangoWeb使用Datatable进行后端分页的实现
May 18 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 16 Python
如何获取numpy array前N个最大值
May 14 Python
python 如何用terminal输入参数
May 25 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
中国第一家无线电行
2021/03/01 无线电
php下将图片以二进制存入mysql数据库中并显示的实现代码
2010/05/27 PHP
PHP学习笔记 IIS7下安装配置php环境
2012/10/29 PHP
php结合md5的加密解密算法实例
2016/09/30 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
2017/02/15 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
jquery插件star-rating.js实现星级评分特效
2015/04/15 Javascript
js拆分字符串并将分割的数据放到数组中的方法
2015/05/06 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
javaScript封装的各种写法
2017/08/14 Javascript
JavaScript中.min.js和.js文件的区别讲解
2019/02/13 Javascript
vue style width a href动态拼接问题的解决
2020/08/07 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
Python PyQt5标准对话框用法示例
2017/08/23 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
python密码错误三次锁定(实例讲解)
2017/11/14 Python
浅谈python中拼接路径os.path.join斜杠的问题
2018/10/23 Python
Python实现的矩阵转置与矩阵相乘运算示例
2019/03/26 Python
Ubuntu16.04安装python3.6.5步骤详解
2020/01/10 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
详解Python GUI编程之PyQt5入门到实战
2020/12/10 Python
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
css3 flex布局 justify-content:space-between 最后一行左对齐
2020/01/02 HTML / CSS
悦木之源美国官网:Origins美国
2016/08/01 全球购物
澳大利亚领先的皮肤诊所:Skin Matrix(抗衰老、痤疮专家、药妆护肤)
2018/05/20 全球购物
卡骆驰德国官方网站:Crocs德国
2019/03/29 全球购物
Oasis服装官网:时尚女装在线
2020/07/09 全球购物
金融专业推荐信
2013/11/14 职场文书
工伤事故赔偿协议书
2014/04/15 职场文书
单方离婚协议书范本2014
2014/10/28 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
详解MySQL多版本并发控制机制(MVCC)源码
2021/06/23 MySQL