Python中的enumerate和zip怎么使用
这篇文章主要介绍“Python中的enumerate和zip怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中的enumerate和zip怎么使用”文章能帮助大家解决问题。
1. enumerate 方法
我们在上述了解了迭代器的相关的知识点,对于可迭代对象列表、字典等可以使用for...in来进行快速遍历。例如对序列items使用for循环进行如下遍历,不用进行计算长度多余步骤。
for item in items:
但是,如上的遍历无法知道items序列每一个元素的索引,如果实际场景中,需要使用元素的索引呢?通常,我们会创建一个变量index,来记录元素的索引位置
index = 0for 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)]# correctfor index,(x,y) in enumerate(data): ...# Errorfor 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 12anne 16tom 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_longestfor 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中的enumerate和zip怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341