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中的循环遍历相关推荐

  1. python闭包的应用场景_聊聊Python闭包-阿里云开发者社区

    Python中的闭包不是一个一说就能明白的概念,但是随着你往学习的深入,无论如何你都需要去了解这么一个东西. 闭包的概念 我们尝试从概念上去理解一下闭包. 在一些语言中,在函数中可以(嵌套)定义另一个 ...

  2. JAVA中增强循环中用线程_在Java中以循环方式运行线程

    我是Java中的多线程和同步的新手.我正在尝试实现一项任务,其中给了我5个文件,每个文件将由一个特定线程读取.每个线程应从文件读取一行,然后将执行转发到下一个线程,依此类推.当所有5个线程都读取第一行 ...

  3. 层序遍历 和 基于栈实现的先\中\后序遍历

    层序遍历 和 基于栈实现的先/中/后序遍历 1 层序遍历 level order traversal 2 基于栈实现的先/中/后序遍历 pre/in/post order traversal 1 层序 ...

  4. python双重for循环怎么理解_理解 Python 的 for 循环

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 在本篇博客中,我们将讨论 Python 中 for 循环的原理. 我们将从一组基本例子和它的语法开始,还将 ...

  5. python的循环控制语句有_关于Python中的for循环控制语句

    import math for i in range(50, 100 + 1): for j in range(2, int(math.sqrt(i)) + 1): if i % j == 0: br ...

  6. python中for循环语句格式_关于Python中的for循环控制语句

    #第一个:求 50 - 100 之间的质数 import math for i in range(50, 100 + 1): for j in range(2, int(math.sqrt(i)) + ...

  7. python遍历是什么意思_在Python中遍历列表的方法有哪些

    Python中遍历列表有以下几种方法: 一.for循环遍历lists = ["m1", 1900, "m2", 2000] for item in lists: ...

  8. python基础教程读书笔记_《Python基础教程》 读书笔记 第五章(下)循环语句

    导读热词 5.5.1while循环 x=1 while x<=100: print x x+=1 确保用户输入了名字: name="" while not name: nam ...

  9. python 单元测试_聊聊 Python 的单元测试框架(一):unittest

    本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 前言 说到 Python 的单元测试框架,想必接触过 Python 的朋友脑袋里第一个想到的就是 unittest. ...

最新文章

  1. java上传加密_Java上传下载文件并实现加密解密
  2. spring中事务的设计和实现
  3. 【转】三分钟了解Fiori背后的设计理念
  4. SpringMVC中通过@ResponseBody返回对象,Js中调用@ResponseBody返回值,统计剩余评论字数的js,@RequestParam默认值,@PathVariable的用法
  5. java web中验证码的实现
  6. android控件使用大全,Android常见控件使用详解
  7. zookeeper 负载_ZooKeeper,策展人以及微服务负载平衡的工作方式
  8. java生成三角网_源码:基于离散点的构TIN算法(三角网)
  9. IT部领导总结:不想被淘汰,看看快速做报表的技巧,甚至能养老
  10. python关键词对联_keras基于CNN和序列标注的对联机器人
  11. 亿贝html5,亿贝CALL
  12. The /usr/local/mysql/data directory is not owned by the 'mysql' to '_mysql' user
  13. 解决Sublime Text 2中文显示乱码问题
  14. ssm基于Java web的校园滴滴代驾管理系统毕业设计源码260839
  15. CAPL中的键值对(hash)数据类型
  16. win10计算机盘符如何,删除win10电脑多余无需使用的盘符教程
  17. 数据分析 第七篇:方差分析(单因素方差分析)
  18. 日系插画学习笔记(十二):如何增加画面完整度
  19. cpython cython_Cython的用法以及填坑姿势
  20. python 批量读取csv_Python Pandas批量读取csv文件到dataframe的方法

热门文章

  1. h5+app打开pdf,图片,excel,world(亲测可用)
  2. 根据词频、背景图绘制词云图
  3. linux下gperf工具(tcmalloc)检查C/C++代码内存泄露问题操作说明
  4. Appium常用操作及H5页面元素定位
  5. openstack九大模块
  6. 八皇后问题理解与解决
  7. 数据中台和大数据数据仓库的区别
  8. db2 修改表空间自增长_db2 创建表空间、增大表空间以及增加临时表空间
  9. BeeGo环境新建时候的问题
  10. 句向量表示--BERT-FLOW,BERT-whitening, ConSERT, coSENT