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写asp详细讲解
Dec 16 Python
python在命令行下使用google翻译(带语音)
Jan 16 Python
Python多线程编程(五):死锁的形成
Apr 05 Python
python 字符串转列表 list 出现\ufeff的解决方法
Jun 22 Python
Python基于time模块求程序运行时间的方法
Sep 18 Python
python读取各种文件数据方法解析
Dec 29 Python
python 生成器和迭代器的原理解析
Oct 12 Python
Python编程快速上手——疯狂填词程序实现方法分析
Feb 29 Python
TensorFlow使用Graph的基本操作的实现
Apr 22 Python
利用python实现平稳时间序列的建模方式
Jun 03 Python
opencv读取视频并保存图像的方法
Jun 04 Python
Django实现WebSocket在线聊天室功能(channels库)
Sep 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
PHP 文件上传进度条的两种实现方法的代码
2007/11/25 PHP
PHP下用rmdir实现删除目录的三种方法小结
2008/04/20 PHP
php生成随机数或者字符串的代码
2008/09/05 PHP
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
2010/05/10 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
PHP输出一个等腰三角形的方法
2015/05/12 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
2016/06/30 PHP
jQuery 树形结构的选择器
2010/02/15 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
2012/05/24 Javascript
Javascript事件实例详解
2013/11/06 Javascript
关于JS数组追加数组采用push.apply的问题
2014/06/09 Javascript
window.onload使用指南
2015/09/13 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
JS实现动态给标签控件添加事件的方法示例
2017/05/13 Javascript
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
利用vscode调试编译后的js代码详解
2018/05/14 Javascript
mpvue微信小程序多列选择器用法之省份城市选择的实现
2019/03/07 Javascript
vue鼠标悬停事件实例详解
2019/04/01 Javascript
用 js 写一个 js 解释器过程详解
2019/08/02 Javascript
详谈Python中列表list,元祖tuple和numpy中的array区别
2018/04/18 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
基于python实现把json数据转换成Excel表格
2020/05/07 Python
List, Set, Map是否继承自Collection接口?
2016/05/16 面试题
自我鉴定范文300字
2013/10/01 职场文书
学校办公室主任职责
2013/12/27 职场文书
公司保密承诺书
2014/03/27 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
综合测评个人总结
2015/03/03 职场文书
2015年保洁工作总结范文
2015/04/28 职场文书
旅行社计调工作总结
2015/08/12 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
分家协议书范本
2016/03/22 职场文书
MySQL count(*)统计总数问题汇总
2022/09/23 MySQL