前言
我们在上一期学习了关于Python 迭代器Iterator详情相关的概念,满足迭代器需要符合两个条件
-
实现
__iter__()
方法:返回迭代器本省 -
实现
__next__()
方法:返回迭代器的下一项
同时,Python中提供数据类型如列表、字典、元组等序列是可迭代对象,可结合for...in 来进行遍历为使我们的代码更加高效且优雅,Python也提供两个关于迭代的方法。因此,本期我们来学习enumerate函数和zip函数的相关使用方法,Let's go~~
1. enumerate 方法
我们在上述了解了迭代器的相关的知识点,对于可迭代对象列表、字典等可以使用for...in来进行快速遍历。例如对序列items使用for循环进行如下遍历,不用进行计算长度多余步骤。
1
|
for item in items: |
但是,如上的遍历无法知道items序列每一个元素的索引,如果实际场景中,需要使用元素的索引呢?通常,我们会创建一个变量index,来记录元素的索引位置
1
2
3
4
|
index = 0 for item in items: # options index + = 1 |
虽然上述方式可以解决我们的需求,但是代码显示非常的冗余,不符合pythonic的规范
在Pythonic要求中,我们可以使用enumerate()函数来替代上述实现方法
1
2
3
|
for index,item in enumerate (items): # options ... |
- enumerate()函数返回是一个enumerate对象实例,它是一个迭代器。
- enumerate对象返回是连续包含一个由计数和值组成的元组(index,value)
- 元组中value值通过传入序列上调用的**next()**返回的
但是,当序列中的元素是元组类型时,在使用enumerate()函数时,需要对value进行严格区分。
1
2
3
4
5
6
7
|
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()函数可以解决以上两问题。
1
2
3
4
5
6
7
8
9
|
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。当某个序列到结尾了,迭代也会随之结束。迭代长度跟参数中最短序列长度一致。
1
2
3
4
5
6
7
8
9
|
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() 函数来代替。
1
2
3
4
5
6
7
8
9
|
from itertools import zip_longest for stu in zip_longest(names,ages): print (stu) ... ( 'bone' , 12 ) ( 'anne' , 16 ) ( 'tom' , 19 ) ( 'tony' , None ) ... |
同时,使用zip()函数可以方便对两列表打包生成字典:
1
2
3
4
5
|
s = dict ( zip (names,ages)) print (s) ... { 'bone' : 12 , 'anne' : 16 , 'tom' : 19 } ... |
zip()会创建一个迭代器来作为结果返回的。如果将结果需要存储在列表中,则需要list()进行转换
1
2
3
4
5
|
print ( list ( zip (names,ages))) ... [( 'bone' , 12 ), ( 'anne' , 16 ), ( 'tom' , 19 )] ... |
总结
本期对Python针对序列遍历符合PythonIC的两种方法 enumerate函数和zip函数enumerate函数可以方便处理索引问题,zip函数处理多对象迭代场景。
到此这篇关于Python中的 enumerate和zip的文章就介绍到这了,更多相关Python enumerate和zip内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://juejin.cn/post/7102400579250421774