☰
零基础学Python · 第 19 课|列表的增删改查
2026/9/28 4:47:10 网站建设 项目流程

动作是pop, 这属于为盒子进行放蛋操作以及取出鸡蛋的整套技巧。

19.先进行查找, 然后进行修改。

查与改

nums = [10, 20, 30, 20, 40]

# 查1: 判断存在(in 是布尔,最常用)

print(20 in nums) # True

print(99 in nums) # False

# 查2: 找位置(首次出现的下标;不存在报 ValueError)

print(nums.index(20)) # 0(第一个 20 的位置)

# 查3: 数个数

print(nums.count(20)) # 2

# 改: 下标赋值,直接覆盖原格

nums[0] = 99

print(nums) # [99, 20, 30, 20, 40]

19.第二步是增加内容, 具体包括三种不同的放置方法。

这三种增长的情况。

nums = [1, 2]

# append: 追加到末尾(90% 的场景用它)

nums.append(3) # [1, 2, 3]

# insert: 指定位置插入,后面的元素整体后移

nums.insert(1, 99) # [1, 99, 2, 3]

# extend: 把另一个列表的元素逐个并进来

nums.extend([7, 8]) # [1, 99, 2, 3, 7, 8]

# 常见错误: append 一个列表 vs extend 一个列表

a = [1, 2]

a.append([3, 4]) # [1, 2, [3, 4]] —— 整个列表当成了"一个元素"!

b = [1, 2]

b.extend([3, 4]) # [1, 2, 3, 4] —— 摊开并入

19.关于删除的操作, 具体存在三种不同的删除方法。

三种删与遍历删除陷阱

nums = [10, 20, 30, 20, 40]

# pop: 按下标删,并"返回"被删的值(唯一能拿回尸体的删法)

last = nums.pop() # 删掉末尾 40, last = 40

second = nums.pop(1) # 删掉下标1 的 20, second = 20

# remove: 按"值"删,只删第一个匹配的

nums.remove(20) # 删掉剩下的那个 20

# del: 语句(不是方法),按下标删,不返回

# del nums[0]

print(nums) # [30]

# 循环中删除元素的大坑!

nums = [1, 2, 2, 3, 2]

# for n in nums:

# if n == 2:

# nums.remove(n) # 漏删!

遍历时删元素, 后面的会"补位"跳过

# 正确姿势: 遍历副本, 删原件

for n in nums[:]: # nums[:] 是列表的浅拷贝

if n == 2:

nums.remove(n)

print(nums) # [1, 3]

删法

删什么

返回值

适用场景

pop()

末尾或者指的是指定的下标。

被删元素

一方面需要进行删除操作, 另一方面也要使用(取走处理)

(x)

第一个值为 x 的

None

只晓得具体的数值, 不清楚它在什么地方。

del lst

指定下标

就是单纯地进行删除操作, 并且还可以进行切片方式的删除。

有两个保命提醒需要特别注意: 第一点是指在涉及不存在的值进行报错处理的场景里, 必须在执行删除操作之前先使用 like if x in lst 这样的代码去进行检查;第二点是强调在遍历列表的过程中绝对不要直接删除其元素, 因为元素的补位现象会导致漏删的情况发生, 如果一定要这么做, 那就应该去遍历该列表的一个副本, 也就是 nums。

要不先把那些需要删除的下标都给收集起来, 等到最后再统一执行删除的操作。

把(input())这个步骤放到循环里去, 用户如果输入5个成绩, 那么你就收集好了5个数据, 这种所谓的收集器模式, 你在成绩管理系统中肯定已经使用过了。

你要深入思考一下, 为什么在收集完之后还需要进行float类型转换呢, 因为input函数接收到的东西全部都是字符串类型的, 即进入的数据是字符串, 而后面的sum函数在处理时会遇到问题, 具体的做法要么就是在存入之前就进行转换, 要么就是统一到后面再进行转换。

️ 本课练习

这是练习一: 你要去创建一个用于装商品的购物清单, 然后模拟一套操作过程。第一个步骤是先把 3 件不同的商品放进去。第二个步骤是在这个清单的最前面插入一个叫做"优惠券"的东西。第三个步骤是把之前插入的"优惠券"从列表里删掉。

第四个步骤是用 pop这个方法把列表里最后剩下的那件商品拿出来, 并且打印出一句话, 显示“已结账: xx”。在上面的所有这些操作的每一环节完成之后, 你都要马上把这个列表里的当前内容给打印出来看看。

这四个步骤分别对应的是四个应用程序接口。在使用pop方法的时候, 需要注意把返回值接收下来并打印出来。因为在三种删除方法当中只有它具备删除之后仍然能够获取数据的特性。这个特性在队列和栈结构这类算法基础知识之中是非常核心的一种操作方式。

练习的第二部分是关于对列表 nums = 进行清理。

3, 7, 3, 3, 8, 3, 9

把那个副本拿来, 一个一个地去遍历它, 这样就能把所有的数字3都删掉了, 然后把最终的结果给输出出来, 再认真地数一下自己一共删去了几个。

首先是数一数里面3出现了多少次, 然后再去进行那个for循环, 让n在nums里面一个一个地过一遍。

当n的值等于3的时候, 执行nums.(n)这个操作, 得出的结果是。

7, 8, 9

结果, 删除了 4 个。大家可别忘了这道题目里面的陷阱问题所在, 如果直接在 nums 这个数组上面进行遍历并且执行删除操作的话, 就会发生遗漏删除的错误情况的出现, 大家如果不相信的话, 自己去尝试操作一次就可以了。

练习3: 给定列表等于。

5, 2, 9, 1, 7

不用系统自带的 max 函数、min 函数或是 sort 排序功能, 来找出其中最大的那些数值以及对应的下标信息, 整个过程只需要经过一遍扫描即可完成。

= lst

先把变量初始化为零, 然后再开始遍历那个列表, 至于为什么这么写, 要等到下一节课才能详细讲解, 只要发现更大的数值, 就同时更新值和下标这两个信息,这种既像打擂台又像是在记录具体位置的解决模式, 就是手动求出最大值还是最小值的标准答案。

请练习一下, 并好好思考一下这个问题: 这里为什么要同时提供 pop、del 这三种删除操作? 难道只使用其中一种是不行的吗?

这一些方法会回答三个不同的方面的问题, 第一个是“删除第几个”, 这就是pop或者del这样的操作, 第二个是“删除这个具体的值”, 这是一个空白的括号部分, 第三个是关于“删除了以后还要不要继续使用”的问题, 这个问题的存在是因为只有pop方法会有返回值。

API的丰富度是为了让意图直接写在代码里面, 当你看到pop的时候就知道这里取走元素是有用的, 当你看到空白括号知道是按值进行清理的清除操作的, 因为代码是用来给人读的这么说的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询