百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

列表删除元素方法知多少?Python列表删除黑科技的终极PK

liuian 2025-03-13 17:21 8 浏览

许多Python新手在数据清洗时,仍在使用笨拙的for循环删除列表元素。殊不知这会导致O(n^2)时间复杂度,当处理百万级数据时,耗时将暴增600%。今天我们来看下列表删除元素的四大天王,看看谁更厉害!

一、remove单杀无敌

首先,我们来看remove()方法,上代码:

animals = ["", "", "", ""]
animals.remove("")
print(animals)

运行结果:

['', '', '']

代码解读:remove()根据值删除元素,但只会删除第一个匹配项。当处理重复数据时,容易造成"漏删"现象,这是列表操作中最常见的隐藏bug。

二、 毁灭者del的AOE

matrix = [[1,2], [3,4], [5,6]]
del matrix[1:3]  # 删除索引1到2(不含3)
print(matrix)  # [[1, 2]]
del matrix
print(matrix)  # NameError: name 'matrix' is not defined

运行结果:

[[1, 2]]
NameError: name 'matrix' is not defined

开发技巧:del支持切片删除和多维数据结构操作,也支持直接删除整个列表变量。可删除后这个变量就被毁灭了,存储的数据也就没了,所以使用del删除操作请务必谨慎!

三、背刺之王pop()的意外惊喜

stack = ["", "", ""]
last_item = stack.pop()
print(f"取出 {last_item},剩余 {stack}")

cache = ["A", "B", "C", "D"]
cache.pop(0)
print(cache)

运行结果:

取出 ,剩余 ['', '']
['B', 'C', 'D']

从代码中我们看出,当无参数的时候,pop()的默认用法是将列表的最后一个元素踢出列表并返回,所以我们可以通过pop()的返回值获取列表的最后一个元素。而给pop()设置一个索引值的时候,我们也可以获取对应索引的值。pop()的返回值特性,使其天然适合实现栈(先进后出)、队列(先进先出)等数据结构,这是其他删除方法做不到的。

四、杀手之王clear()的终极清场

chat_history = ["你好", "吃了吗", "在干嘛"]
chat_history.clear()
print(chat_history)

运行结果:

[]

clear()的用法是直接删除列表中的所有元素。

clear()与del()的区别:这两者都可以删除列表中的所有元素,他们之间有什么区别呢?

temp = [1,2,3];
del temp  # 完全销毁
print(temp)
temp2 = [4,5,6]
temp2.clear()  # 清空但保留壳
print(temp2)  # []

运行结果:

NameError: name 'matrix' is not defined
[]

从运行结果我们可以知道,del()删除的时候是将变量列表都删除了,所以会提示变量'matrix'没有被定义。而clear()则只会删除列表中的元素,存储元素的这个变量外壳还被保留了下来。

易错点警报

  1. 循环删除黑洞:在遍历列表时删除元素会导致索引错乱(这个错误在Python新手期很常见),请看示例代码:
# 删除列表中的偶数
numbers = [1, 2, 4, 6, 7, 8]
for num in numbers:
    if num % 2 == 0:
        numbers.remove(num)
print(numbers) 

运行结果:

[1, 4, 7]

运行结果中遗留了偶数4,为什么会出现这种情况呢?下面我们来分析一下代码运行的过程:初始列表索引:[0:1, 1:2, 2:4, 3:6, 4:7, 5:8],当删除索引1的元素2后,列表变为 [1,4,6,7,8],循环继续处理下一个索引2(原列表的索引3),此时元素是6(正确应处理新列表的索引1元素4),结果导致元素4被跳过未被删除。

我们可以用以下三种方案来解决这个问题:

#  方法1:创建新列表
numbers = [1, 2, 4, 6, 7, 8]
numbers = [num for num in numbers if num % 2 != 0]

#  方法2:倒序遍历(避免索引前移)
for num in reversed(numbers):
    if num % 2 == 0:
        numbers.remove(num)

#  方法3:遍历副本
for num in numbers.copy():
    if num % 2 == 0:
        numbers.remove(num)

运行结果:

[1, 7]

这三种方案都可以完整的删除列表中的偶数,不引起索引的混乱。

  1. pop()的致命空弹:空列表使用pop会引发IndexError
empty = []
empty.pop()

运行结果:

IndexError: pop from empty list

错误提示:索引错误,对空列表进行pop操作。这个错误提示很直白的告诉我们,不可以对空列表进行pop操作


练习

基础题:删除列表["","","",""]中所有的瓜类水果(以""结尾)

进阶题:实现函数批量删除列表中的素数(要求时间复杂度O(n))

彩蛋题:当执行 [1,2,3].remove(4) 时会发生什么?如何优雅处理?


上期文章练习参考答案

基础题答案

lst = []
for c in "hello":
    lst.append(c)

进阶题答案

class RingBuffer:
    def __init__(self):
        self.buffer = []

    def add(self, item):
        if len(self.buffer) >= 5:
            self.buffer.pop(0)
        self.buffer.append(item)

彩蛋题答案

def reverse_list(lst):
    res = []
    for x in lst:
        res.insert(0, x)
    return res

相关推荐

GANs为何引爆机器学习?这篇基于TensorFlow的实例教程为你解惑!

「机器人圈导览」:生成对抗网络无疑是机器学习领域近三年来最火爆的研究领域,相关论文层出不求,各种领域的应用层出不穷。那么,GAN到底如何实践?本文编译自Medium,该文作者以一朵玫瑰花为例,详细阐...

高丽大学等机构联合发布StarGAN:可自定义表情和面部特征

原文来源:arXiv、GitHub作者:YunjeyChoi、MinjeChoi、MunyoungKim、Jung-WooHa、SungKim、JaegulChoo「雷克世界」编译:嗯~...

TensorFlow和PyTorch相继发布最新版,有何变化

原文来源:GitHub「机器人圈」编译:嗯~阿童木呀、多啦A亮Tensorflow主要特征和改进在Tensorflow库中添加封装评估量。所添加的评估量列表如下:1.深度神经网络分类器(DNNCl...

「2022 年」崔庆才 Python3 爬虫教程 - 深度学习识别滑动验证码缺口

上一节我们使用OpenCV识别了图形验证码躯壳欧。这时候就有朋友可能会说了,现在深度学习不是对图像识别很准吗?那深度学习可以用在识别滑动验证码缺口位置吗?当然也是可以的,本节我们就来了解下使用深度...

20K star!搞定 LLM 微调的开源利器

LLM(大语言模型)微调一直都是老大难问题,不仅因为微调需要大量的计算资源,而且微调的方法也很多,要去尝试每种方法的效果,需要安装大量的第三方库和依赖,甚至要接入一些框架,可能在还没开始微调就已经因为...

大模型DeepSeek本地部署后如何进行自定义调整?

1.理解模型架构a)查看深度求索官方文档或提供的源代码文件,了解模型的结构、输入输出格式以及支持的功能。模型是否为预训练权重?如果是,可以在预训练的基础上进行微调(Fine-tuning)。是否需要...

因配置不当,约5000个AI模型与数据集在公网暴露

除了可访问机器学习模型外,暴露的数据还可能包括训练数据集、超参数,甚至是用于构建模型的原始数据。前情回顾·人工智能安全动态向ChatGPT植入恶意“长期记忆”,持续窃取用户输入数据多模态大语言模型的致...

基于pytorch的深度学习人员重识别

基于pytorch的深度学习人员重识别Torchreid是一个库。基于pytorch的深度学习人员重识别。特点:支持多GPU训练支持图像的人员重识别与视频的人员重识别端到端的训练与评估简单的re...

DeepSeek本地部署:轻松训练你的AI模型

引言:为什么选择本地部署?在AI技术飞速发展的今天,越来越多的企业和个人希望将AI技术应用于实际场景中。然而,对于一些对数据隐私和计算资源有特殊需求的用户来说,云端部署可能并不是最佳选择。此时,本地部...

谷歌今天又开源了,这次是Sketch-RNN

前不久,谷歌公布了一项最新技术,可以教机器画画。今天,谷歌开源了代码。在我们研究其代码之前,首先先按要求设置Magenta环境。(https://github.com/tensorflow/magen...

Tensorflow 使用预训练模型训练的完整流程

前面已经介绍了深度学习框架Tensorflow的图像的标注和训练数据的准备工作,本文介绍一下使用预训练模型完成训练并导出训练的模型。1.选择预训练模型1.1下载预训练模型首先需要在Tensorf...

30天大模型调优学习计划(30分钟训练大模型)

30天大模型调优学习计划,结合Unsloth和Lora进行大模型微调,掌握大模型基础知识和调优方法,熟练应用。第1周:基础入门目标:了解大模型基础并熟悉Unsloth等工具的基本使用。Day1:大模...

python爬取喜马拉雅音频,json参数解析

一.抓包分析json,获取加密方式1.抓包获取音频界面f12打开抓包工具,播放一个(非vip)视频,点击“媒体”单击打开可以复制URL,发现就是我们要的音频。复制“CKwRIJEEXn-cABa0Tg...

五、JSONPath使用(Python)(json数据python)

1.安装方法pipinstalljsonpath2.jsonpath与Xpath下面表格是jsonpath语法与Xpath的完整概述和比较。Xpathjsonpath概述/$根节点.@当前节点...

Python网络爬虫的时候json=就是让你少写个json.dumps()

大家好,我是皮皮。一、前言前几天在Python白银交流群【空翼】问了一个Python网络爬虫的问题,提问截图如下:登录请求地址是这个:二、实现过程这里【甯同学】给了一个提示,如下所示:估计很多小伙伴和...