圆月山庄资源网 Design By www.vgjia.com
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会这么流行。
以上就是聊聊python中的循环遍历的详细内容,更多关于python 循环遍历的资料请关注其它相关文章!
圆月山庄资源网 Design By www.vgjia.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
圆月山庄资源网 Design By www.vgjia.com
暂无评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2024年11月02日
2024年11月02日
- 《暗喻幻想》顺风耳作用介绍
- 崔健1985-梦中的倾诉[再版][WAV+CUE]
- 黄子馨《追星Xin的恋人们2》HQ头版限量编号[WAV+CUE]
- 孟庭苇《情人的眼泪》开盘母带[低速原抓WAV+CUE]
- 孙露《谁为我停留HQCD》[低速原抓WAV+CUE][1.1G]
- 孙悦《时光音乐会》纯银CD[低速原抓WAV+CUE][1.1G]
- 任然《渐晚》[FLAC/分轨][72.32MB]
- 英雄联盟新英雄安蓓萨上线了吗 新英雄安蓓萨技能介绍
- 魔兽世界奥杜尔竞速赛什么时候开启 奥杜尔竞速赛开启时间介绍
- 无畏契约CGRS准星代码多少 CGRS准星代码分享一览
- 张靓颖.2012-倾听【少城时代】【WAV+CUE】
- 游鸿明.1999-五月的雪【大宇国际】【WAV+CUE】
- 曹方.2005-遇见我【钛友文化】【WAV+CUE】
- Unity6引擎上线:稳定性提升、CPU性能最高提升4倍
- 人皇Sky今日举行婚礼!电竞传奇步入新篇章