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中用Descriptor实现类级属性(Property)详解
Sep 18 Python
简单介绍Python的轻便web框架Bottle
Apr 08 Python
简介Python中用于处理字符串的center()方法
May 18 Python
python3实现抓取网页资源的 N 种方法
May 02 Python
关于python的list相关知识(推荐)
Aug 30 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
python 使用值来排序一个字典的方法
Nov 16 Python
Linux CentOS Python开发环境搭建教程
Nov 28 Python
python中p-value的实现方式
Dec 16 Python
python tkinter之顶层菜单、弹出菜单实例
Mar 04 Python
Python3 mmap内存映射文件示例解析
Mar 23 Python
python 读取串口数据的示例
Nov 09 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 字符串中的\n换行符无效、不能换行的解决方法
2014/04/02 PHP
php中foreach结合curl实现多线程的方法分析
2016/09/22 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
2016/10/29 PHP
关于javascript document.createDocumentFragment()
2009/04/04 Javascript
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
javascript设计模式之中介者模式Mediator
2014/12/30 Javascript
javascript数组去重的六种方法汇总
2015/08/16 Javascript
jQuery form 表单验证插件(fieldValue)校验表单
2016/01/24 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
微信小程序 数据遍历的实现
2017/04/05 Javascript
深入理解Angular4中的依赖注入
2017/06/07 Javascript
Vue中组件之间数据的传递的示例代码
2017/09/08 Javascript
vue双向数据绑定知识点总结
2018/04/18 Javascript
微信小程序实现漂亮的弹窗效果
2020/05/26 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
基于Vue中使用节流Lodash throttle详解
2019/10/30 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
原生JS实现汇率转换功能代码实例
2020/05/13 Javascript
vue.js实现简单购物车功能
2020/05/30 Javascript
Python中操作MySQL入门实例
2015/02/08 Python
Python的Flask框架中@app.route的用法教程
2015/03/31 Python
python爬取拉勾网职位数据的方法
2018/01/24 Python
pycham查看程序执行的时间方法
2018/11/29 Python
Python3实现汉语转换为汉语拼音
2019/07/08 Python
在python Numpy中求向量和矩阵的范数实例
2019/08/26 Python
使用Python将图片转正方形的两种方法实例代码详解
2020/04/29 Python
Python 防止死锁的方法
2020/07/29 Python
html5 Canvas画图教程(1)—画图的基本常识
2013/01/09 HTML / CSS
庆祝教师节活动方案
2014/01/31 职场文书
公司离职证明标准范本
2014/10/05 职场文书
学院党委班子四风问题自查报告及整改措施
2014/10/25 职场文书
上诉状格式
2015/05/23 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
标准版个人借条怎么写?以及什么是借条?
2019/08/28 职场文书
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL