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 相关文章推荐
netbeans7安装python插件的方法图解
Dec 24 Python
从零学Python之hello world
May 21 Python
跟老齐学Python之深入变量和引用对象
Sep 24 Python
获取Django项目的全部url方法详解
Oct 26 Python
基于python3 OpenCV3实现静态图片人脸识别
May 25 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
Mar 05 Python
python中的列表与元组的使用
Aug 08 Python
python做接口测试的必要性
Nov 20 Python
Windows上安装tensorflow  详细教程(图文详解)
Feb 04 Python
django为Form生成的label标签添加class方式
May 20 Python
python Tornado框架的使用示例
Oct 19 Python
Python 中 sorted 如何自定义比较逻辑
Feb 02 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设计模式 Observer(观察者模式)
2011/06/26 PHP
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
浅谈PHP Cookie处理函数
2016/06/10 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
一段非常简单的让图片自动切换js代码
2006/11/10 Javascript
JQuery对checkbox操作 (循环获取)
2011/05/20 Javascript
IE8对JS通过属性和数组遍历解析不一样的地方探讨
2013/05/06 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
一个简单的jquery的多选下拉框(自写)
2014/05/05 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/06/05 Javascript
jquery转盘抽奖功能实现
2015/11/13 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
2017/06/19 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
2018/09/05 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
详解Python中用于计算指数的exp()方法
2015/05/14 Python
Python函数式编程指南(三):迭代器详解
2015/06/24 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
Python使用folium excel绘制point
2019/01/03 Python
python中正则表达式与模式匹配
2019/05/07 Python
Python进度条的制作代码实例
2019/08/31 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
2019/10/11 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
CSS3动画之流彩文字效果+图片模糊效果+边框伸展效果实现代码合集
2017/08/18 HTML / CSS
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
HTML5中input输入框默认提示文字向左向右移动的示例代码
2020/09/10 HTML / CSS
职业规划书如何设计?
2014/01/09 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
2014年小学美术工作总结
2014/12/20 职场文书
会议主持人开场白台词
2015/05/28 职场文书