当前位置:首页>python>【Python】Day09:列表进阶 —— 增删改查与排序

【Python】Day09:列表进阶 —— 增删改查与排序

  • 2026-10-11 07:43:02
【Python】Day09:列表进阶 —— 增删改查与排序

🎯 学习目标

  1. 掌握列表 增 的四种方式:append()、insert()、extend()、+
  2. 掌握列表 删 的四种方式:remove()、pop()、del、clear()
  3. 掌握列表 改 的方式:索引赋值与切片赋值
  4. 掌握列表 查 的方式:index()、count()、in,以及遍历列表
  5. 掌握sort()与sorted()的区别,能按升序/降序/自定义规则排序
  6. 学会reverse()、copy()等常用方法
  7. 初步认识列表推导式,写出简洁的列表生成代码
    元组与列表基本类似,不再开一篇文章介绍(本篇尾部少量介绍)。

一、增:往列表里添加元素

  1. append(): 在末尾追加一个元素(最常用!)
    fruits = ["苹果", "香蕉"]fruits.append("橘子")print(fruits)          # ['苹果', '香蕉', '橘子']# append 添加的是"一个元素",如果追加的是列表,会整体作为一个元素fruits.append(["葡萄", "西瓜"])print(fruits)          # ['苹果', '香蕉', '橘子', ['葡萄', '西瓜']]
  2. insert():在指定位置插入一个元素
    nums = [10, 20, 30, 40]nums.insert(2, 25)     # 在索引2的位置插入25print(nums)            # [10, 20, 25, 30, 40]# 插入到最前面nums.insert(0, 5)print(nums)            # [5, 10, 20, 25, 30, 40]# 索引超出范围?插到末尾,不会报错nums.insert(999, 50)print(nums)            # [5, 10, 20, 25, 30, 40, 50]
  3. extend():把另一个列表的所有元素追加到末尾
    a = [1, 2, 3]b = [4, 5, 6]a.extend(b)print(a)              # [1, 2, 3, 4, 5, 6]print(b)              # [4, 5, 6]  b 没变# 对比 appendc = [1, 2, 3]c.append([4, 5, 6])print(c)              # [1, 2, 3, [4, 5, 6]]  整个列表作为一个元素!
  4. 对比总结
    方法
    作用
    原列表
    返回值
    append(x)
    末尾加一个元素
    ✅ 改变
    None
    insert(i, x)
    在索引 i 处插入元素
    ✅ 改变
    None
    extend(列表)
    末尾追加多个元素
    ✅ 改变
    None
    + 拼接
    返回新列表
    ❌ 不变
    新列表
    # extend 是原地修改a = [1, 2]result = a.extend([3, 4])print(a)              # [1, 2, 3, 4]print(result)         # None!不是新列表# + 是创建新列表b = [1, 2]c = b + [3, 4]print(b)              # [1, 2]  没变print(c)              # [1, 2, 3, 4]

二、删:从列表里删除元素

  1. remove():按值删除(删除第一个匹配项)
    fruits = ["苹果", "香蕉", "橘子", "香蕉"]fruits.remove("香蕉")print(fruits)          # ['苹果', '橘子', '香蕉']  只删了第一个!# 删除不存在的值会报错# fruits.remove("西瓜")  # ValueError: list.remove(x): x not in list
  2. pop():按索引删除,并返回被删除的元素
    nums = [10, 20, 30, 40, 50]# 不传参数:删除并返回最后一个last = nums.pop()print(last)            # 50print(nums)            # [10, 20, 30, 40]# 传索引:删除并返回指定位置的元素second = nums.pop(1)print(second)          # 20print(nums)            # [10, 30, 40]
  3. del:按索引或切片删除(语句,不是方法)
    nums = [10, 20, 30, 40, 50]# 删除单个元素del nums[1]print(nums)            # [10, 30, 40, 50]# 删除一个切片del nums[1:3]print(nums)            # [10, 50]# 删除整个列表变量# del nums# print(nums)          # NameError: name 'nums' is not defined
  4. clear():清空整个列表
    nums = [1, 2, 3, 4, 5]nums.clear()print(nums)            # []  空列表,但变量还在
  5. 四种删除方式对比
    方式
    按什么删
    返回值
    找不到时
    remove(x)
    按值
    NoneValueError
    pop(i)
    按索引
    被删元素
    IndexError
    del list[i]
    按索引/切片
    无
    IndexError
    clear()
    全部清空
    None
    —

三、改:修改列表中的元素

  1. 索引赋值:修改单个元素
    fruits = ["苹果", "香蕉", "橘子"]fruits[1] = "芒果"print(fruits)          # ['苹果', '芒果', '橘子']
  2. 切片赋值:修改一段元素
    nums = [1, 2, 3, 4, 5]nums[1:3] = [20, 30]print(nums)            # [1, 20, 30, 4, 5]# 替换的元素个数可以不同:用1个替换3个nums = [1, 2, 3, 4, 5]nums[1:4] = [200]print(nums)            # [1, 200, 5]# 用切片赋值插入元素(巧妙用法)nums = [1, 2, 5]nums[2:2] = [3, 4]     # 在索引2处"插入"print(nums)            # [1, 2, 3, 4, 5]

四、查:在列表中查找与遍历

  1. index():查找元素第一次出现的索引
    fruits = ["苹果", "香蕉", "橘子", "香蕉"]pos = fruits.index("香蕉")print(pos)             # 1# 指定查找范围pos2 = fruits.index("香蕉", 2)   # 从索引2开始找print(pos2)            # 3
  2. count():统计元素出现次数
    nums = [1, 2, 3, 2, 4, 2, 5]print(nums.count(2))   # 3print(nums.count(9))   # 0
  3. in/not in:判断元素是否存在
    fruits = ["苹果", "香蕉", "橘子"]print("香蕉"in fruits)       # Trueprint("西瓜"notin fruits)   # True
  4. 遍历列表:用for循环逐个访问
    fruits = ["苹果", "香蕉", "橘子"]# 方式一:直接遍历元素(最常用)for fruit in fruits:    print(fruit)# 方式二:用 enumerate 同时获取索引和元素for i, fruit in enumerate(fruits):    print(f"第{i}个水果是:{fruit}")# 第0个水果是:苹果# 第1个水果是:香蕉# 第2个水果是:橘子# 方式三:用 range + len(不推荐,但要知道)for i in range(len(fruits)):    print(fruits[i])

五、排序:sort() 与 sorted()

  1. sort():原地排序,修改原列表
    scores = [85, 92, 78, 96, 61, 88]# 升序(默认)scores.sort()print(scores)          # [61, 78, 85, 88, 92, 96]# 降序scores.sort(reverse=True)print(scores)          # [96, 92, 88, 85, 78, 61]
  2. sorted():返回新列表,原列表不变
    scores = [85, 92, 78, 96, 61, 88]asc = sorted(scores)print(asc)             # [61, 78, 85, 88, 92, 96]print(scores)          # [85, 92, 78, 96, 61, 88]  原列表没变!desc = sorted(scores, reverse=True)print(desc)            # [96, 92, 88, 85, 78, 61]
  3. sort()vssorted()对比
    list.sort()sorted(list)
    是否修改原列表
    ✅ 原地修改
    ❌ 返回新列表
    返回值
    None
    排序后的新列表
    适用范围
    只能用于列表
    可用于任何可迭代对象
    使用场景
    不需要保留原列表时
    需要保留原列表时
  4. reverse():原地反转列表
    nums = [1, 2, 3, 4, 5]nums.reverse()print(nums)            # [5, 4, 3, 2, 1]# 注意:reverse() 是反转顺序,不是降序排序!messy = [3, 1, 4, 1, 5]messy.reverse()print(messy)           # [5, 1, 4, 1, 3]  只是翻转,没有排序
  5. copy():复制列表(浅拷贝)
    a = [1, 2, 3]b = a.copy()          # b 是 a 的副本b[0] = 99print(a)              # [1, 2, 3]  a 没变print(b)              # [99, 2, 3]# 其他复制方式c = a[:]              # 切片复制d = list(a)           # list() 复制

六、列表推导式(初识)

  1. 基本语法
    # 传统写法:生成 0~9 的平方squares = []for x in range(10):    squares.append(x ** 2)print(squares)         # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]# 列表推导式:一行搞定squares = [x ** 2for x in range(10)]print(squares)         # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  2. 带条件的推导式
    # 取 1~20 中的偶数evens = [x for x in range(1, 21) if x % 2 == 0]print(evens)           # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]# 将字符串列表全部转大写words = ["hello", "world", "python"]upper_words = [w.upper() for w in words]print(upper_words)     # ['HELLO', 'WORLD', 'PYTHON']
  3. 推导式的模板
    [表达式 for 变量 in 可迭代对象 if 条件]
    • 先看for 变量 in 可迭代对象:遍历每一个元素
    • 再看if 条件:筛选满足条件的
    • 最后看表达式:对筛选出的元素做变换

⚠️ 常见坑

  1. append()/sort()/reverse()返回None,不要赋值!
    a = [3, 1, 2]# b = a.sort()        # b 是 None!不是排序后的列表!# 正确做法a.sort()print(a)              # [1, 2, 3]# 或者用 sorted()b = sorted([3, 1, 2]) # b 是 [1, 2, 3]
  2. remove()只删第一个匹配项
    nums = [1, 2, 3, 2, 4]nums.remove(2)print(nums)           # [1, 3, 2, 4]  第二个2还在!# 删除所有2的正确方式nums = [1, 2, 3, 2, 4]while2in nums:    nums.remove(2)print(nums)           # [1, 3, 4]
  3. 遍历时删除元素容易出错
    # ❌ 错误:遍历时删除,会跳过元素nums = [1, 2, 2, 3, 4]for n in nums:if n == 2:        nums.remove(n)print(nums)           # [1, 2, 3, 4]  漏删了一个!# ✅ 正确方式一:用列表推导式生成新列表nums = [1, 2, 2, 3, 4]nums = [n for n in nums if n != 2]print(nums)           # [1, 3, 4]# ✅ 正确方式二:从后往前删nums = [1, 2, 2, 3, 4]for i in range(len(nums)-1, -1, -1):if nums[i] == 2:        nums.pop(i)print(nums)           # [1, 3, 4]
  4. 列表赋值不是复制!
    a = [1, 2, 3]b = a                  # b 和 a 指向同一个列表!b[0] = 99print(a)              # [99, 2, 3]  a 也变了!# 正确的复制方式a = [1, 2, 3]b = a.copy()          # 或 a[:] 或 list(a)b[0] = 99print(a)              # [1, 2, 3]  a 没变

✍️ 实战练习

  1. 学生成绩管理(增删改查)
    • 要求:维护一个成绩列表,依次完成:添加成绩、删除最低分、修改某个成绩、查询某个分数出现次数。
    • 示例:
      scores = [85, 92, 78, 96, 88]# 增:添加新成绩scores.append(73)print("添加后:", scores)       # [85, 92, 78, 96, 88, 73]# 删:删除最低分scores.remove(min(scores))print("删除最低分后:", scores)   # [85, 92, 96, 88]# 改:把78改成95(假设你知道78在索引0——实际要先查)scores = [85, 92, 78, 96, 88]idx = scores.index(78)scores[idx] = 95print("修改后:", scores)        # [85, 92, 95, 96, 88]# 查:88出现了几次print("88出现次数:", scores.count(88))
  2. 排行榜排序
    • 要求:给定成绩列表,分别输出升序排行和降序排行。
    • 示例:
      scores = [85, 92, 78, 96, 88]# 方式一:sorted 不改变原列表print("升序:", sorted(scores))print("降序:", sorted(scores, reverse=True))print("原列表:", scores)        # 没变# 方式二:sort 原地修改scores.sort(reverse=True)print("排行榜:", scores)        # [96, 92, 88, 85, 78]
  3. 列表推导式练习
    • 要求:用列表推导式生成以下列表:
      输出 1 到 50 中所有 3 的倍数把`["hello", "world", "python"]`每个单词首字母大写生成一个 10 个 0 的列表 `[0, 0, 0, ...]`
    • 示例:
      # 1~50 中 3 的倍数multiples = [x for x in range(1, 51) if x % 3 == 0]print(multiples)# 首字母大写words = ["hello", "world", "python"]titled = [w.title() for w in words]print(titled)                    # ['Hello', 'World', 'Python']# 10 个 0zeros = [0for _ in range(10)]print(zeros)                     # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  4. 数据清洗:去除列表中的空值
    • 要求:给定一个包含空字符串和 None 的列表,用列表推导式去除所有空值。
    • 示例:
      data = ["hello", "", "world", None, "python", "", "day09"]cleaned = [x for x in data if x]  # 空字符串和 None 都是"假值"print(cleaned)                    # ['hello', 'world', 'python', 'day09']

 元组:不可变的"列表"

  • 我们已经学会了列表,元组非常简单,就是把[]换成(),且内容不能改。
    # 列表:可变fruits = ["苹果", "香蕉"]fruits[0] = "梨"# ✅ 可以改# 元组:不可变fruits = ("苹果", "香蕉")fruits[0] = "梨"# ❌ 报错!不能改

一、为什么需要元组?

  1. 坐标点、矩阵位置标记等场景需要用元组作为字典的键(Key)
    # ✅ 元组可以作为 dict 的 keylocations = {    (116.4, 39.9): "北京",    (121.5, 31.2): "上海",}# ❌ 列表不能作为 key# locations[[116.4, 39.9]] = "北京"  # TypeError: unhashable type: 'list'
  2. 数据库配置、版本号定义等场景数据完整性保护(防止意外修改)
    # 配置项,全局常量,不允许运行时篡改DB_CONFIG = ("localhost", 3306, "mydb", "utf8mb4")# 如果有人试图修改,立即报错# DB_CONFIG[1] = 3307  # TypeError: 'tuple' object does not support item assignment

二、元组冷知识

  • 写法
    含义
    说明
    a = (1,)
    元组 (1,)
    元组只有一个元素时需要加上逗号
    a = 1, 2, 3
    元组 (1, 2, 3)
    元组甚至可以不用括号

✅ 自测清单

  • [ ] 能区分append()、insert()、extend()三种添加方式的使用场景
  • [ ] 能区分remove()、pop()、del、clear()四种删除方式
  • [ ] 知道append()和extend()的区别:追加一个元素 vs 追加多个元素
  • [ ] 知道sort()是原地排序返回None,sorted()返回新列表
  • [ ] 能用for循环和enumerate()遍历列表
  • [ ] 能写出基本列表推导式,理解 [表达式 for 变量 in 可迭代对象 if 条件]
  • [ ] 知道列表赋值b = a不是复制,必须用.copy()或 a[:]或list(a)
  • [ ] 知道遍历时删除元素容易出错,应该用推导式或从后往前删

最新文章

随机文章