聊聊python中的循环遍历

作者:皛心 时间:2022-06-17 23:44:43 

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,循环,遍历
0
投稿

猜你喜欢

  • Javascript实现单选框效果

    2024-04-23 09:06:42
  • python中xlutils库用法浅析

    2023-06-05 15:22:26
  • 基于Python实现股票收益率分析

    2022-03-15 20:24:08
  • 驯服CSS选择器--健壮我们的样式表

    2009-10-27 16:13:00
  • 带你了解python装饰器

    2023-08-26 23:10:57
  • mysql 存储过程 使用小结

    2010-10-25 20:02:00
  • Go实现分布式系统高可用限流器实战

    2024-02-18 14:40:10
  • 常见的python正则用法实例讲解

    2023-03-11 23:11:29
  • 浅谈Python xlwings 读取Excel文件的正确姿势

    2021-10-15 23:33:36
  • JavaScript实现获取最近7天的日期的方法详解

    2024-04-27 15:20:59
  • php延迟静态绑定实例分析

    2023-11-23 11:44:57
  • Python中for循环和while循环的基本使用方法

    2021-02-21 01:29:48
  • numpy中的norm()函数求范数实例

    2022-01-02 01:36:45
  • 为你的ASP程序作一个负载测试

    2008-10-23 13:48:00
  • js模拟实现Array的sort方法

    2024-04-10 11:03:22
  • 关于python多重赋值的小问题

    2023-08-04 06:38:16
  • Python二分法搜索算法实例分析

    2023-11-01 13:13:15
  • 关于Python中request发送post请求传递json参数的问题

    2022-12-23 06:20:33
  • 关于图片存储格式的整理(JPEG格式介绍)

    2023-04-05 12:25:37
  • PHP制作3D扇形统计图以及对图片进行缩放操作实例

    2023-11-17 19:31:47
  • asp之家 网络编程 m.aspxhome.com