Python中级基础系列3.6(八)——如何对迭代器做切片操作&&在for语句中迭代多个可迭代对象

浏览: 1864

对迭代器做切片操作

实际案例:读取文件一定范围的的内容,例如获取5行到10行内容。Python文本文件是可迭代对象,是否可以利用列表切片的方式实现5到10行文本内容的生成器。

案例文件内容

Clipboard Image.png

方法一:readlines()

f=open(r'C:\Users\zengjiamin\Desktop\python.txt')
L=f.readlines()
for x in L[5:10]:
print(x)

Clipboard Image.png

缺点:readlines()会把文件所有内容读取出来,如果某日志文件内容特别大好几个G,全部读取可能会导致灾难性的问题。


方法二:迭代方式 使用标准库中的itertools.islice,返回一个迭代对象切片生成器。

from itertools import islice
f=open(r'C:\Users\zengjiamin\Desktop\python.txt')
f.seek(0)#因为之前使用过f.readlines(),导致文件指针已经跑到文件内容末尾处。使用f.seek(0)使文件指针回到起始点。
for x in islice(f,5,10):
print(x)

Clipboard Image.png


islice帮助

islice(iterable, stop) --> islice object

islice(iterable, start, stop[, step]) --> islice object


在for语句中迭代多个可迭代对象

实际案例一(并行):学生期末考试成绩,语文,英文,数学分别存在三个列表里。同时迭代三个列表,计算每个学生总分。

zip()函数

函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表

语法:

zip(iter1 [,iter2 [...]]) --> zip object

>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped) # 与 zip 相反,可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]

案例实现

from random import  randint
#随机生成一个班10人的语文,数学,英语成绩。
chinese = [randint(60,100) for x in range(10) ]
math = [randint(60,100) for x in range(10) ]
English = [randint(60,100) for x in range(10) ]
total=[]
for c,m,e in zip(chinese,math,English):
total.append(c+m+e)
print(total)

Clipboard Image.png


实际案例二(串行):某年级有三个班,每个班的语文成绩存分别三个列表中,依次迭代每个列表,统计全年级英语高于90的人数。

标准库itertools.chain:

可以把一组迭代对象串联起来,形成一个更大的迭代器

语法

chain(*iterables) --> chain object

from random import  randint
from itertools import chain
#随机生成三个班每个人的语文成绩
c1 = [randint(60,100) for x in range(10) ]
c2 = [randint(60,100) for x in range(11) ]
c3 = [randint(60,100) for x in range(12) ]
count=0
for s in chain(c1,c2,c3):
if s>=90:
count+=1
print(count)

Clipboard Image.png

推荐 1
本文由 粽子job 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册