聊聊python中的循环遍历
作者:皛心 发布时间:2022-06-17 23:44:43
标签:python,循环,遍历
python之循环遍历
关于循环遍历大家都知道,不外乎for和while,今天我在这写点不一样的循环和遍历。在实践中有时会遇到删除列表中的元素,那么循环遍历列表删除指定元素该怎么做呢?
还是直接上代码看案例吧:
import time
# 删除下面列表中所有张姓元素,输出的结果应该是['李老大','李老二']
lst = ['张老大', '张老二', '李老大', '张老三', '李老二']*10000
# 直接for循环遍历列表,remove需要删除的元素
def del1(lst):
for i in lst:
if i[0] == '张':
lst.remove(i) # 在删lst[0]'张老大'的时候,列表长度变成4,导致lst[1]取值成了'李老大',跳过了'张老二'
return lst # 返回的结果不符合预期
# 正向遍历,通过建一个原列表的副本,然后遍历副本,删除原列表中的元素
def del2(lst):
lst2 = lst.copy() # 创建副本内存和时间开销大
for i in lst2:
if i[0] == '张':
lst.remove(i) # 删除第一个匹配的元素,检索匹配时间开销大
return lst # 结果虽然正确,但效率极低,不要用这种方法
# 使用高阶函数filter方法
def del3(lst):
def comp(n): # 创建过滤函数
return n[0] != '张' #对于首字符不是'张'的元素返回True,予以保留。若返回False的予以删除。
return list(filter(comp, lst)) # filter高阶函数删除列表中的元素,
# 删除条件是comp方法,返回的是迭代器,需要list方法转成列表
# 倒序删除法
def del4(lst):
for i in range(len(lst) - 1, -1, -1): # 注意len(lst)必须-1,因为列表元素下标是0至len(lst)-1;注意for循环左开右闭,
# 从lst队尾循环到开头必须是-1,写0会漏了lst[0];-1表示倒序排列。range实际就是int数字列表生成式,在这实际生成的是
# [49999,49998,..1,0],通过下标访问列表的指定元素。
if lst[i][0] == '张':
del lst[i]
return lst
# 倒序删除之while循环,效果和for序号一致,运行效率差别极其微小(for序号方法内存开销略大一点点)。while循环需要写7行,
# for循环只要5行,更推荐使用for循环。但while循环代码阅读起来更易懂。
def del5(lst):
length = len(lst) - 1
while length >= 0:
if lst[length][0] == '张':
del lst[length]
length -= 1
return lst
# lst = del1(lst) # del1方法直接遍历列表删除指定元素,返回结果错误
# print(lst)
# t1 = time.time()
# lst = del2(lst) # del2方法通过创建原列表副本,遍历副本删除原件中的指定元素,返回结果正确,但是运行效率极低
# t2 = time.time()
# print(f"遍历方法删除元素用时:{t2 - t1:.5f}") # 4.51529,在这可以看到代码优化的必要性,运行结果虽然一致但性能差别极大。
# 评价性能一般看2个指标,1是时间消耗,2是资源消耗(通常指内存消耗,特殊场合还有别的资源消耗)。
t1 = time.time()
lst = del3(lst)
t2 = time.time()
print(f"filter方法删除元素用时:{t2 - t1:.5f}") # 0.00596
# t1 = time.time()
# lst = del4(lst)
# t2 = time.time()
# print(f"遍历方法删除元素用时:{t2 - t1:.5f}") # 0.07991
# t1 = time.time()
# lst = del5(lst)
# t2 = time.time()
# print(f"遍历方法删除元素用时:{t2 - t1:.5f}") # 0.08516
以上案例注释非常详细,初学者可以阅读参考。其中del4()for循环和del5()while循环时间消耗几乎一致,for循环内存消耗略大一点点。for循环可以比while循环少写2行代码,学python用python在同样性能指标下自然是代码行数越少越好,写循环优先考虑for。
另外提一句,使用filter高阶函数运行速度是for或while的13-15倍,因为filter实际执行的是c代码。在python中有很多内置方法实际是c代码,用好了会大大提高运行效率。虽然python是公认的开发效率高运行效率低,但是只要针对运算量极大的循环执行代码块进行恰当优化(通常就是使用这种c代码的内置方法,有能力的也可以自定义c代码方法,或者是第三方的c代码方法),python性能并不弱多少,而开发效率提升很多,所以python会这么流行。
来源:https://www.cnblogs.com/fz17/p/13620557.html


猜你喜欢
- 这篇文章主要介绍了python实现XML解析的方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- python遍历迭代器自动链式处理数据pytorch.utils.data可兼容迭代数据训练处理,在dataloader中使用提高训练效率:
- 本文实例讲述了Python爬虫框架Scrapy常用命令。分享给大家供大家参考,具体如下:在Scrapy中,工具命令分为两种,一种为全局命令,
- 本文实例讲述了MySQL 的启动和连接方式。分享给大家供大家参考,具体如下:MySQL运行包括两部分,一部分是服务器端程序mysqld,另外
- Python 异常处理机制还提供了一个 finally 语句,通常用来为 try 块中的程序做扫尾清理工作。注意,和 else 语句不同,f
- 我们在做深度学习的过程中,经常面临图片样本不足、不平衡的情况,在本文中,作者结合实际工作经验,通过图像的移动、缩放、旋转、增加噪声等图像变换
- 本文实例讲述了python检查字符串是否是正确ISBN的方法。分享给大家供大家参考。具体实现方法如下:def isISBN(isbn):
- 前不久微信上线了拍一拍功能,刚推出就被有才的网友玩坏了。还有更多没有节操的拍法这里就不展示了。但拍一拍属于弱提示,只有在聊天界面才能感受到。
- 如何清除Vbscript惹出来的中文乱码? <script language=vbscript runat=s
- 手工实现差异备份的步骤字符型:1、恢复当前库;alter database 当前库 set RECOVERY FULL--2、建表cmd;c
- 在我的印象里面进制互相转换确实是很常见的问题,所以在Python中,自然也少不了把下面这些代码收为util。这是从网上搜索的一篇也的还可以的
- 安装anaconda 是自动集成的如果导入不存在,直接pippip install tqmd参数#参数介绍iterable=None,des
- jQuery之父John Resig写过一篇《Sub-Pixel Problems in CSS》,一个50px宽的div中有4个float
- 使用base64对图片的二进制进行编码并用ajax进行显示有时候我们需要动态的将图片的二进制在页面上进行显示,如我们需要弄一个验证码的功能,
- 一大早就被电话吵醒了,云某项目数据库全挂了,启动不了(睡得太死,没听到报警短信),吓得不轻啊!电话中说所有mysql数据库主库都启动不了,但
- 在新旧版的torch中的傅里叶变换函数在定义和用法上存在不同,记录一下。1、旧版fft = torch.rfft(input, 2, nor
- 在这之前,你首先得了解Python中的PIL库。PIL是Python Imaging Library的简称,PIL是一个Python处理图片
- 一、基本使用最近研究了一下 el-upload组件 踩了一些小坑 写起来大家学习一下很经常的一件事情 经常会去直接拷贝 elem
- 自带库一、datetimedatetime是Python处理日期和时间的标准库。1、获取当前日期和时间>>> from d
- 方式一:数据库用的是SQL 2008,数据表中存放的是图片的二进制数据,现在把图片以一种图片格式(如.jpg)导出,然后存放于指定的文件夹中