python 安全地删除列表元素的方法


Posted in Python onMarch 16, 2022

前言:

看似简单的任务,往往隐藏陷阱!

一个常见的任务是在一个列表上迭代,并根据条件删除一些元素。本文将展示如何完成该任务的不同方法,同时展示一些需要避免的陷阱。

假设我们需要修改列表a,并且必须删除所有不是偶数的项。

首先实现辅助函数even(x)来确定一个数字x是否是偶数:

a = [1, 2, 2, 3, 4]
def even(x):
    return x % 2 == 0

方法1: 创建新列表,过滤元素

1a) 列表推导,创建新列表

使用列表推导创建一个新的列表,只包含你不想删除的元素,并把它分配回a:

a = [1, 2, 2, 3, 4]
def even(x):
    return x % 2 == 0
 
# 列表推导,但创建了一个新的变量a
a = [x for x in a if not even(x)]
# --> a = [1, 3]
print(a)

1b) 列表推导,对a[:]赋值

上面的代码创建了一个新的变量a。我们也可以通过赋值给切片a[:]就地改变现有的列表。这种方法更有效率,如果有其他对a的引用需要反映变化的话,这种方法可能很有用。

a = [1, 2, 2, 3, 4]
def even(x):
    return x % 2 == 0
 
# 列表推导,但赋值给a[:] 就地改变列表
a[:] = [x for x in a if not even(x)]
# --> a = [1, 3]
print(a)

1c) 使用itertools.filterfalse()

itertools模块为非常有效的循环迭代提供了各种函数,并且提供了一种过滤元素的方法。

a = [1, 2, 2, 3, 4]
def even(x):
    return x % 2 == 0
 
# 通过itertools 快速过滤
from itertools import filterfalse
a[:] = filterfalse(even, a)
# --> a = [1, 3]
print(a)

方法2:列表副本上迭代

如果你真的想保留for语法,那么需要在列表的副本上进行迭代(副本可以通过使用a[:]简单创建)。

现在你可以在条件为True时从原始列表中删除元素:

a = [1, 2, 2, 3, 4]
def even(x):
    return x % 2 == 0
 
# 注意是在列表副本a[:] 上循环
for item in a[:]:
    if even(item):
        a.remove(item)
# --> a = [1, 3]
print(a)

常见陷阱

千万别在同一个列表上循环,并在迭代过程中修改它!

这和上面的代码是一样的,只是没有在副本上循环。删除一个元素将使所有后续元素向左移动一个位置,因此在下一次迭代中,一个元素将被跳过。

这可能会导致不正确的结果:

a = [1, 2, 2, 3, 4]
def even(x):
    return x % 2 == 0
 
# 直接在变量a上进行循环,没有在副本上
for item in a:
    if even(item):
        a.remove(item)
# --> a = [1, 2, 3] !!!
print(a)

另外,在列表的循环过程中,千万不要修改索引!

这是不正确的,因为在循环中改变i不会影响下一次迭代中i的值。这个例子也会产生非预期的效果,甚至会导致IndexErrors

比如这里:

a = [1, 2, 2, 3, 4]
def even(x):
    return x % 2 == 0
 
# 试图在循环在改变索引i,但出错!
for i in range(len(a)):
    if even(a[i]):
        del a[i]
        i -= 1
# --> IndexError: list index out of range
print(a)

到此这篇关于python 安全地删除列表元素的方法的文章就介绍到这了,更多相关python 删除列表元素内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
举例区分Python中的浅复制与深复制
Jul 02 Python
Python基于多线程实现抓取数据存入数据库的方法
Jun 22 Python
Django中数据库的数据关系:一对一,一对多,多对多
Oct 21 Python
Python中垃圾回收和del语句详解
Nov 15 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
May 07 Python
Pandas聚合运算和分组运算的实现示例
Oct 17 Python
基于Python绘制美观动态圆环图、饼图
Jun 03 Python
Python如何将装饰器定义为类
Jul 30 Python
Python实现爬取网页中动态加载的数据
Aug 17 Python
Python实现迪杰斯特拉算法过程解析
Sep 18 Python
Python爬虫爬取有道实现翻译功能
Nov 27 Python
python-for x in range的用法(注意要点、细节)
May 10 Python
python turtle绘制多边形和跳跃和改变速度特效
Python中的turtle画箭头,矩形,五角星
Mar 16 #Python
Python学习之异常中的finally使用详解
Mar 16 #Python
Python实现抖音热搜定时爬取功能
Mar 16 #Python
Python3的进程和线程你了解吗
Mar 16 #Python
python的列表生成式,生成器和generator对象你了解吗
Mar 16 #Python
bat批处理之字符串操作的实现
Mar 16 #Python
You might like
PHP 数据结构 算法描述 冒泡排序 bubble sort
2011/07/10 PHP
php实现单链表的实例代码
2013/03/22 PHP
php验证码的制作思路和实现方法
2015/11/12 PHP
PHP基于SPL实现的迭代器模式示例
2018/04/22 PHP
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
Javascript中的delete介绍
2012/09/02 Javascript
jQuery实现点击按钮弹出可关闭层的浮动层插件
2015/09/19 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
2016/03/02 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
JavaScript实现数组降维详解
2017/01/05 Javascript
Angularjs 依赖压缩及自定义过滤器写法
2017/02/04 Javascript
详解nodejs爬虫程序解决gbk等中文编码问题
2017/04/06 NodeJs
浅谈Vue下使用百度地图的简易方法
2018/03/23 Javascript
解决Vue.js父组件$on无法监听子组件$emit触发事件的问题
2018/09/12 Javascript
layui数据表格实现重载数据表格功能(搜索功能)
2019/07/27 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
pytyon 带有重复的全排列
2013/08/13 Python
Python制作刷网页流量工具
2017/04/23 Python
Python绘制3D图形
2018/05/03 Python
Python如何调用JS文件中的函数
2019/08/16 Python
python TK库简单应用(实时显示子进程输出)
2019/10/29 Python
用HTML5.0制作网页的教程
2010/05/30 HTML / CSS
详解HTML5 Canvas绘制时指定颜色与透明度的方法
2016/03/25 HTML / CSS
台湾团购、宅配和优惠券:17Life
2017/08/14 全球购物
Lookfantastic日本官网:英国知名护肤、化妆品和头发护理购物网站
2018/04/21 全球购物
ellesse美国官方商店:意大利高级运动服品牌
2019/10/29 全球购物
审计主管岗位职责
2014/01/31 职场文书
财务总监管理岗位职责
2014/03/08 职场文书
合作协议书模板
2014/10/10 职场文书
干部作风建设年活动剖析材料
2014/10/23 职场文书
培训师岗位职责
2015/02/14 职场文书
自愿离婚协议书范本2016
2016/03/18 职场文书
SQLServer常见数学函数梳理总结
2022/08/05 MySQL
ssh服务器拒绝了密码 请再试一次已解决(亲测有效)
2022/08/14 Servers