删除列表元素很多同学想当然的认为不就是循环遍历加上if判断再del吗?真的有这么简单吗?

还是直接上代码看案例吧:

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,在这可以看到代码优化的必要性。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自然要学简洁的写法,在同样性能指标下代码行数越少越好,写循环优先用for。

另外提一句,使用filter高阶函数运行速度是for或while的13-15倍,因为filter实际执行的是c代码。在python中有很多内置方法实际是c代码,用好了会大大提高运行效率。虽然python是公认的开发效率高运行效率低,但是只要针对运算量极大的循环执行代码块进行恰当优化(通常就是使用这种c代码的内置方法,有能力的也可以自定义c代码方法,或者是第三方的c代码方法),python性能并不弱多少,而开发效率提升很多,所以python会这么流行。

编写代码首先要避免bug,多做测试检查运行结果是否符合预期。其次要注重代码性能(无bug的代码才考虑改进算法提高性能,有bug的代码0性能),代码性能一般看2个指标,1是时间消耗,2是资源消耗(通常指内存消耗,特殊场合还有别的资源消耗)。

在学习python的路上,大家一起加油吧,有空也可以逛逛我的博客园,我会坚持每天更新。

https://www.cnblogs.com/fz17/

python列表元素交换位置_python删除列表元素5种方法,你会的是错误法还是最优解?...相关推荐

  1. python输出矩阵的转置_Python 矩阵转置的几种方法小结

    我就废话不多说了,直接上代码吧! #Python的matrix转置 matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] def printmatrix(m): fo ...

  2. python定位元素在列表中的位置_python定位列表元素

    Python 列表(list)提供了 index() 和 count() 方法,它们都可以用来查找元素. index() 方法 index() 方法用来查找某个元素在列表中出现的位置(也就是索引),如 ...

  3. python for 循环中使用 remove 删除列表中的元素

    python for 循环中使用 remove 删除列表中的元素 错误的代码 # !/usr/bin/python # encoding: utf-8 # -*- coding: utf8 -*- o ...

  4. python中的列表是什么意思_python中列表的用法是什么

    列表(list)是最常用的Python数据类型,它可以作为一个方括号内的逗号分割值出现. List中的数据项不需要具有相同的类型,可以进行的操作包括索引(第一个索引是0,第二个索引是1,以此类推).切 ...

  5. js调整数组某些元素到指定位置顺序_js 实现数组元素交换位置

    /** * 数组元素交换位置 * @param {array} arr 数组 * @param {number} index1 添加项目的位置 * @param {number} index2 删除项 ...

  6. python的三种取整方式_python 取整的两种方法

    问题简介: 要把一个浮点数(float)整数部分提取出来.比如把"2.1"变成"2"的这一过程:现在我们给这个过程起一个名字叫"取整".那么 ...

  7. Python爬虫入门之爬虫解析提取数据的四种方法

    本文主要介绍了Python爬虫入门之爬虫解析提取数据的四种方法,通过具体的内容向大家展现,希望对大家Python爬虫的学习有所帮助. 基础爬虫的固定模式 笔者这里所谈的基础爬虫,指的是不需要处理像异步 ...

  8. Python炫技操作:花式导包的八种方法

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 五岳寻仙不辞远,一身好入名山游. ...

  9. Python中记住过去(模型状态)的五种方法

    在Python中记住过去(模型状态)的五种方法 从封闭函数和迭代器到状态机Python库 有人说... "那些不能记住过去的人,注定要重复它".G. Santayana, 1905 ...

最新文章

  1. git.exe 启动 慢_拳头:今年将修复英雄联盟客户端 启动时间降到19秒
  2. Visual Studio 扩展包(.vsix)制作
  3. PAT甲级1079 Total Sales of Supply Chain:[C++题解] 树、结点到根结点的距离、树形dp、记忆化搜索
  4. std::get(std::tuple)
  5. Keil 5安装激活教程
  6. 如何从Fiori launchpad发出的请求判断出后台是哪个网关系统在响应
  7. 面向工业场景,如何实现绿色智能?
  8. C4996    'fopen': This function or variable may be unsafe
  9. 20155225 2006-2007-2 《Java程序设计》第四周学习总结
  10. Python使用turtle绘制阴阳鱼图案
  11. python的简单GUI(登录窗口)
  12. Qt5 for linux离线安装工具下载地址
  13. Ubuntu 18.04 ibus安装配置中文拼音输入法
  14. 共享文件问题: 你可能没有权限使用网络资源。请与这台服务器的管理员联系以查明你是否有访问权限。
  15. vue按住shift键多选(以element框架的table为例)
  16. Unity开发OpenXR | (一)OpenXR是什么?一文带你全面了解OpenXR的相关知识,上车收藏不迷路
  17. 上线7天融资1.5亿,还有50多家VC在排队,子弹短信为何受追捧?
  18. [编译原理]DO-WHILE循环语句的翻译程序设计(LR(1)方法、输出四元式)C++实现
  19. 一份Yann LeCun等16个顶级数据科学家给新人的建议
  20. AbstractQueuedSynchronizer同步队列与Condition等待队列协同机制

热门文章

  1. torch.nn.Linear()函数的理解
  2. 人工智能训练云燧T10
  3. Halide视觉神经网络优化
  4. [JAVAEE] 理解“自然模板“+使用 ModelAndView 对象
  5. 零起点学算法17——比较2个数大小
  6. Python 匹配字符串开头内容与结尾内容(startswith与endswith)
  7. Collections.addAll() 的使用 以及和list.addAll() 的区别
  8. Android include 标签使用
  9. Manifest merger failed with multiple errors, see logs
  10. 吴裕雄--天生自然 高等数学学习:无穷级数