聊聊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 测试实现方法
Dec 24 Python
Centos5.x下升级python到python2.7版本教程
Feb 14 Python
python使用socket连接远程服务器的方法
Apr 29 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 Python
查看python下OpenCV版本的方法
Aug 03 Python
用python爬取租房网站信息的代码
Dec 14 Python
python实现知乎高颜值图片爬取
Aug 12 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
Aug 12 Python
Python模块的制作方法实例分析
Dec 21 Python
Python实现结构体代码实例
Feb 10 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
Mar 16 Python
浅谈python 调用open()打开文件时路径出错的原因
Jun 05 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
php数组总结篇(一)
2008/09/30 PHP
php/js获取客户端mac地址的实现代码
2013/07/08 PHP
详解PHP导入导出CSV文件
2014/11/03 PHP
javascript &&和||运算法的另类使用技巧
2009/11/28 Javascript
jQuery getJSON 处理json数据的代码
2010/07/26 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
JavaScript中的console.profile()函数详细介绍
2014/12/29 Javascript
jQuery自定义添加"$"与解决"$"冲突的方法
2015/01/19 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
2015/03/23 Javascript
JavaScript实现常用二级省市级联下拉列表的方法
2015/03/25 Javascript
javascript操作select元素实例分析
2015/03/27 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
2016/07/04 Javascript
AngularJS 依赖注入详解和简单实例
2016/07/28 Javascript
如何处理JSON中的特殊字符
2016/11/30 Javascript
JS瀑布流实现方法实例分析
2016/12/19 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
2017/04/04 jQuery
jQuery实现简单的计时器功能实例分析
2017/08/29 jQuery
JavaScript模块模式实例详解
2017/10/25 Javascript
使用vue-cli+webpack搭建vue开发环境的方法
2017/12/22 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
python利用rsa库做公钥解密的方法教程
2017/12/10 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
django中间键重定向实例方法
2019/11/10 Python
python numpy数组复制使用实例解析
2020/01/10 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
2020/03/16 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
四议两公开实施方案
2014/03/28 职场文书
流动人口婚育证明
2014/10/19 职场文书