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实现示例
Aug 26 Python
Python中的列表生成式与生成器学习教程
Mar 13 Python
一键搞定python连接mysql驱动有关问题(windows版本)
Apr 23 Python
50行Python代码实现人脸检测功能
Jan 23 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
Oct 31 Python
解决Python3.5+OpenCV3.2读取图像的问题
Dec 05 Python
解决python线程卡死的问题
Feb 18 Python
Django学习笔记之为Model添加Action
Apr 30 Python
使用Python3内置文档高效学习以及官方中文文档
May 19 Python
Python批量生成幻影坦克图片实例代码
Jun 04 Python
详解Python中的测试工具
Jun 09 Python
python 实现生成均匀分布的点
Dec 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+javascript模拟Matrix画面
2006/10/09 PHP
mysql5写入和读出乱码解决
2006/11/25 PHP
PHP生成HTML静态页面实例代码
2008/08/31 PHP
PHP执行zip与rar解压缩方法实现代码
2010/12/05 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
利用PHP如何写APP接口详解
2016/08/23 PHP
javascript delete 使用示例代码
2010/03/29 Javascript
Js获取事件对象代码
2010/08/05 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
2014/05/04 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
2015/07/27 Javascript
Bootstrap 过渡效果Transition 模态框(Modal)
2017/03/17 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
vue中遇到的坑之变化检测问题(数组相关)
2017/10/13 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
Vue实现点击箭头上下移动效果
2020/06/11 Javascript
Python的动态重新封装的教程
2015/04/11 Python
python中map、any、all函数用法分析
2015/04/21 Python
Python网络编程 Python套接字编程
2017/09/13 Python
python+pandas分析nginx日志的实例
2018/04/28 Python
在Python中使用defaultdict初始化字典以及应用方法
2018/10/31 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
解决django中ModelForm多表单组合的问题
2019/07/18 Python
Python更新所有已安装包的操作
2020/02/13 Python
Python实现AI换脸功能
2020/04/10 Python
财务专业大学生职业生涯规划范文
2013/12/30 职场文书
库房主管岗位职责
2013/12/31 职场文书
学习十八大标语
2014/10/09 职场文书
教师辞职书范文
2015/02/26 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书
HTML5之高度塌陷问题的解决
2022/06/01 HTML / CSS
Java获取字符串编码格式实现思路
2022/09/23 Java/Android