聊聊python中的循环遍历


Posted in Python onSeptember 07, 2020

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 循环遍历的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python生成指定长度的随机数密码
Jan 23 Python
python实现在目录中查找指定文件的方法
Nov 11 Python
Python 正则表达式入门(初级篇)
Dec 07 Python
Python基于正则表达式实现文件内容替换的方法
Aug 30 Python
python实现微信跳一跳辅助工具步骤详解
Jan 04 Python
python实现requests发送/上传多个文件的示例
Jun 04 Python
Python Pexpect库的简单使用方法
Jan 29 Python
python读写csv文件方法详细总结
Jul 05 Python
python 寻找离散序列极值点的方法
Jul 10 Python
python中opencv实现图片文本倾斜校正
Jun 11 Python
Python学习之异常中的finally使用详解
Mar 16 Python
Python 统计序列中元素的出现频度
Apr 26 Python
详解python中的闭包
Sep 07 #Python
python logging模块的使用
Sep 07 #Python
了解一下python内建模块collections
Sep 07 #Python
Python pymsql模块的使用
Sep 07 #Python
Python虚拟环境的创建和使用详解
Sep 07 #Python
python用Tkinter做自己的中文代码编辑器
Sep 07 #Python
利用Python将图片中扭曲矩形的复原
Sep 07 #Python
You might like
php5数字型字符串加解密代码
2008/04/24 PHP
使用PHP访问RabbitMQ消息队列的方法示例
2018/06/06 PHP
基于jquery的放大镜效果
2012/05/30 Javascript
JavaScript自定义事件介绍
2013/08/29 Javascript
javascript 实现动态侧边栏实例详解
2016/11/11 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
2016/12/13 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
基于canvas粒子系统的构建详解
2017/08/31 Javascript
JavaScript正则表达式函数总结(常用)
2018/02/22 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
Python解决鸡兔同笼问题的方法
2014/12/20 Python
Python中函数的参数定义和可变参数用法实例分析
2015/06/04 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
python版百度语音识别功能
2019/07/09 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
python 实现矩阵按对角线打印
2019/11/29 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
Python自动创建Excel并获取内容
2020/09/16 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
1688平价精选商城:阿里集团旗下,工厂出厂价格直销
2017/04/24 全球购物
介绍一下Linux文件的记录形式
2013/09/29 面试题
英文版餐饮业求职信
2013/10/18 职场文书
个人简历自我评价
2014/01/06 职场文书
大学校园生活自我鉴定
2014/01/13 职场文书
2014年秋季开学典礼致辞
2014/08/02 职场文书
车辆年检委托书范本
2014/10/14 职场文书
幼儿园开学家长寄语(2016春季)
2015/12/03 职场文书
心得体会该怎么写呢?
2019/06/27 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
使用这 6个Vue加载动画库来减少我们网站的跳出率
2021/05/18 Vue.js
十大经典日本动漫排行榜 海贼王第三,犬夜叉仅第八
2022/03/18 日漫