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):
   ...

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)]
...

来源:https://juejin.cn/post/7102400579250421774

标签:Python,enumerate,zip
0
投稿

猜你喜欢

  • python数据可视化Seaborn绘制山脊图

    2023-12-22 09:04:17
  • js中火星坐标、百度坐标、WGS84坐标转换实现方法示例

    2024-04-25 13:12:57
  • 深入了解Python的类与模块化

    2021-04-18 11:28:29
  • 如何列出我所需要数据视图?

    2010-01-12 20:00:00
  • php返回相对时间(如:20分钟前,3天前)的方法

    2023-10-26 11:20:38
  • Python3 XML 获取雅虎天气的实现方法

    2023-02-13 16:35:38
  • 如何用Python绘制3D柱形图

    2022-12-19 04:22:04
  • 为自己的网站添加RSS功能

    2007-11-05 19:18:00
  • Python正则表达式实现截取成对括号的方法

    2023-08-22 23:01:47
  • Python matplotlib以日期为x轴作图代码实例

    2021-08-17 03:41:09
  • Python3利用Qt5实现简易的五子棋游戏

    2022-03-31 20:39:12
  • 解决Python中导入自己写的类,被划红线,但不影响执行的问题

    2021-07-11 19:10:29
  • Python使用QQ邮箱发送Email的方法实例

    2021-03-25 11:33:57
  • Pandas读取行列数据最全方法

    2022-06-23 09:34:22
  • Python 文件读写操作实例详解

    2023-08-04 10:41:53
  • 如何用ASP输出HTML文件?

    2010-06-11 20:01:00
  • Python自动化办公之Word文档的创建与生成

    2022-06-16 17:49:43
  • PYTHON 中使用 GLOBAL引发的一系列问题

    2023-07-08 16:24:21
  • XMLHTTP获取web造访头信息和网页代码

    2010-04-01 14:37:00
  • vue 解决mintui弹窗弹起来,底部页面滚动bug问题

    2024-04-30 10:47:22
  • asp之家 网络编程 m.aspxhome.com