聊聊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基础之I/O模型
May 11 Python
Python基于Matplotlib库简单绘制折线图的方法示例
Aug 14 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
Jul 25 Python
Pycharm 字体大小调整设置的方法实现
Sep 27 Python
python实现操作文件(文件夹)
Oct 31 Python
python给图像加上mask,并提取mask区域实例
Jan 19 Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 Python
tensorflow下的图片标准化函数per_image_standardization用法
Jun 30 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
Jul 09 Python
python实现三壶谜题的示例详解
Nov 02 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
Jan 12 Python
5个pandas调用函数的方法让数据处理更加灵活自如
Apr 24 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下关于Cannot use a scalar value as an array的解决办法
2010/08/08 PHP
PHP在特殊字符前加斜杠的实现代码
2011/07/17 PHP
PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析
2017/02/04 PHP
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
2012/10/11 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
2016/06/13 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
2016/08/03 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
2017/06/13 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
webpack实用小功能介绍
2018/01/02 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
浅析Vue.js 中的条件渲染指令
2018/11/19 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
详解基于Wepy开发小程序插件(推荐)
2019/08/01 Javascript
webpack是如何实现模块化加载的方法
2019/11/06 Javascript
js实现简单的打印表格
2020/01/15 Javascript
vue项目在webpack2实现移动端字体自适配功能
2020/06/02 Javascript
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
2017/05/25 Python
Python中Flask-RESTful编写API接口(小白入门)
2019/12/11 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
2020/01/15 Python
python 调用API接口 获取和解析 Json数据
2020/09/28 Python
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
农药学硕士毕业生自荐信
2013/09/25 职场文书
工作表扬信的范文
2014/01/10 职场文书
开会迟到检讨书
2014/02/03 职场文书
《口技》教学反思
2014/02/21 职场文书
2014社区三八妇女节活动方案
2014/03/30 职场文书
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
本溪水洞导游词
2015/02/11 职场文书
2019年暑期法院实习报告
2019/12/18 职场文书
关于Numpy之repeat、tile的用法总结
2021/06/02 Python
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL
mysql的数据压缩性能对比详情
2021/11/07 MySQL
Anaconda安装pytorch和paddle的方法步骤
2022/04/03 Python
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers