Python中的 enumerate和zip详情
作者:??盆友圈的小可爱???? 发布时间:2022-10-22 23:48:30
前言
我们在上一期学习了关于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):
...
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)]
...
来源:https://juejin.cn/post/7102400579250421774
猜你喜欢
- Declare @Id varchar(20) Declare @Name varchar(20) Declare Cur Cursor F
- Internet的规模每一百天就会增长一倍,客户希望获得7天×24小时的不间断可用性及较快的系统反应时间,而不愿屡次看到某个站点“Serve
- 废话不多说了,关键代码如下所示:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 T
- 读视频,提取帧接口函数:cv2.VideoCapture()通过video_capture = cv2.VideoCapture(video
- 1. 系统盘清理说明win7 80G的系统盘,随着使用时间的增加,空间越来越小,只剩不到2G,随计划清理系统盘数据1. maven 下载的j
- 一个不错的js星级评分代码,可以评多个指标。相关文章推荐:用css制作星级投票评分功能 效果图:<script language=&q
- 因为要用到过滤一组中重复的数据,使之变成没有重复的一组数据的功能,百度了一下,居然有朋友乱写,而且比较多,都没有认真测试过,只对字符可以,但
- 在项目开发中,定时执行php脚本对数据库进行数据更新操作的需求非常常见,下面就以win系统为例进行操作。以下配置需要保证php环境可以正常运
- 在刚学Pandas时,行选择和列选择非常容易混淆,在这里进行一下讨论和归纳本文的数据来源:https://github.com/fiveth
- 表单验证是WEB开发中经常遇到的问题,我们以前常见的做法是:在客户端对表单域进行内容的检查,看是否是满足一定的要求或满足一定的结构,比如:是
- 一个网站能切换不同的CSS风格大家应该都了解,像众所周知的腾讯在今年改版时也增加了切换皮肤的功能。根据时间自动调整站点风格是不错的想法,这种
- 如下所示:# 选取等于某些值的行记录 用 == df.loc[df['column_name'] == some_value
- 一、导入库import randomimport time二、注册用户我们用变量与input实现name = str(input('
- 一. 背景介绍当集团的MySQL数据库实例数达到2000+、MHA集群规模数百个时,对MHA的及时、高效管理是DBA必须面对的一个挑战。MH
- 前言我们先说一下思路:先对目标网站发送请求,获取html源码,然后对源码里面的所以图片链接进行筛选,然后再次对图片链接发送请求,然后保存。思
- 这篇文章主要介绍了python re模块匹配贪婪和非贪婪模式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 主要记录一下:图片验证码1.获取登录界面的图片2.获取验证码位置3.在登录页面截取验证码保存4.调用百度api识别(目前准确率较高的识别图片
- 前言:本文为 HITwh 网络空间安全专业网络空间安全设计与实践 I 的选题之一,主要实现了远程监控局域网内的主机桌面与网络情况、简单键鼠控
- 时区的概念与转换首先要知道时区之间的转换关系,其实这很简单:把当地时间减去当地时区,剩下的就是格林威治时间了。 例如北京时间的18:00就是
- 一、记事本源码#python简易记事本from tkinter import *from tkinter import messagebox