第4章 四大容器

列表、元组、字典、集合:什么时候用哪个、增删改查怎么做、遍历与嵌套。

数据结构第5-6周3 讲8 段示例代码

本章学习目标

  • 能区分 list/tuple/dict/set 的特点与适用场景
  • 能熟练做增删改查与切片
  • 能用字典表达“键值”结构并遍历
  • 能用集合做去重与交并差

本章导览

核心内容

4.1

列表与元组

列表 = 可变有序序列(最常用);元组 = 不可变有序序列(当“记录”用)。

能对列表做增删改查与切片能用 sort/sorted、reverse 排序知道元组与列表的取舍

知识点

增删改查

  • append 尾部加、insert(i, x) 指定位置插、extend 合并另一个列表。
  • remove(值) 按值删、pop(i) 按下标删并返回、del lst[i] 直接删。
  • index 找位置、count 计数、in 判断存在、len 取长度。

切片与排序

  • lst[a:b] 切片(返回新列表)、lst[::-1] 反转、lst[::2] 步长。
  • lst.sort() 原地排序,sorted(lst) 返回新列表;key= 指定排序依据。

元组

  • t = (1, 2, 3) 不可修改,适合表示一条不会变的记录(如坐标、行数据)。
  • 解包:a, b = 1, 2;函数返回多值本质就是元组。

代码示例

▶ 列表基本操作
PYTHON
fruits = ["苹果", "香蕉"]
fruits.append("橙子")
fruits.insert(0, "葡萄")
print(fruits, len(fruits))
fruits.remove("香蕉")
print(fruits)
👀 运行结果
['葡萄', '苹果', '香蕉', '橙子'] 4
['葡萄', '苹果', '橙子']
▶ 排序与切片
PYTHON
scores = [88, 92, 76, 95, 60]
scores.sort(reverse=True)
print(scores)
print(scores[:3])
👀 运行结果
[95, 92, 88, 76, 60]
[95, 92, 88]
▶ 元组解包
PYTHON
point = (3, 5)
x, y = point
print(f"x={x}, y={y}")
👀 运行结果
x=3, y=5

常见错误

⚠️ 踩坑与解决
  • IndexError: list index out of range
    → 下标超出范围;用 len 检查,或 for 遍历
  • 列表在循环里被删除导致漏项
    → 一边遍历一边 remove;用新列表推导式或倒序遍历

💡 函数返回多个值时习惯返回元组,调用方直接解包,代码最干净。

4.2

字典

键值对容器:按名字查东西,是处理结构化数据(JSON、表格行)的主力。

能增删改查字典能安全取值 get / setdefault能遍历键、值、键值对

知识点

基本操作

  • d = {"name": "张三", "score": 89};d["age"] = 20 新增/修改。
  • del d["age"] / d.pop("age") 删除;"name" in d 判断键是否存在。
  • 键必须是不可变类型(字符串、数字、元组),值可以是任何类型。

安全取值

  • d.get("age") 不存在返回 None;d.get("age", 0) 返回默认值。
  • d.setdefault("tags", []).append("新") 常用于“不存在就建”。
  • 直接 d["不存在的键"] 会抛 KeyError。

遍历三种方式

  • for k in d: 遍历键;for v in d.values(): 遍历值。
  • for k, v in d.items(): 同时拿键值(最常用)。
  • 嵌套字典:d["张三"]["成绩"],注意逐层判断是否存在。

代码示例

▶ 增删改查
PYTHON
stu = {"name": "张三", "score": 89}
stu["age"] = 20
stu["score"] = 92
print(stu.get("age"), stu.get("class", "未分班"))
print(stu)
👀 运行结果
20 未分班
{'name': '张三', 'score': 92, 'age': 20}
▶ 统计词频
PYTHON
words = ["java", "python", "python", "c"]
cnt = {}
for w in words:
    cnt[w] = cnt.get(w, 0) + 1
print(cnt)
👀 运行结果
{'java': 1, 'python': 2, 'c': 1}
▶ 遍历键值
PYTHON
d = {"语文": 88, "数学": 95}
for subject, score in d.items():
    print(f"{subject}: {score}")
👀 运行结果
语文: 88
数学: 95

常见错误

⚠️ 踩坑与解决
  • KeyError: 'age'
    → 用了不存在的键;改用 d.get("age")
  • RuntimeError: dictionary changed size during iteration
    → 遍历时增删字典;先 list(d.items()) 复制再遍历

💡 统计类问题一律“先想字典”:get(k, 0) + 1 是最小套路。

4.3

集合与容器选择

集合自动去重、支持交并差,适合“查找有没有 / 去重 / 比对”。

能创建集合并去重能用 & | - 做交并差能根据场景选 list/tuple/dict/set

知识点

集合的特点

  • s = {1, 2, 3} 无序、元素唯一、元素必须可哈希(不能是列表)。
  • set(lst) 是最快的去重方式;空集合必须写 set(),{} 是空字典。
  • 判断成员极快(哈希),比在列表里 in 快得多。

集合运算

  • 交集 a & b、并集 a | b、差集 a - b、对称差 a ^ b。
  • add / remove / discard(remove 不存在会报错,discard 不会)。

怎么选容器

  • 要顺序、要重复、要按位置取 → list。
  • 一条不会变的数据 → tuple。
  • 按名字查 → dict;只关心“有没有/去重” → set。

代码示例

▶ 去重与交集
PYTHON
a = [1, 2, 2, 3, 4]
b = [3, 4, 5]
print(set(a))
print(set(a) & set(b))
print(set(a) - set(b))
👀 运行结果
{1, 2, 3, 4}
{3, 4}
{1, 2}
▶ 成员判断
PYTHON
valid = {"admin", "teacher", "student"}
role = "admin"
print(role in valid)
👀 运行结果
True

常见错误

⚠️ 踩坑与解决
  • TypeError: unhashable type: 'list'
    → 把列表放进集合;转成元组 tuple(lst) 再加
  • {} 被当成空字典
    → 空集合写成了 {};用 set() 创建空集合

💡 “两个列表求共同元素”直接用 set & set,比双层循环快一个数量级。