第4章 四大容器
列表、元组、字典、集合:什么时候用哪个、增删改查怎么做、遍历与嵌套。
本章学习目标
- 能区分 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;函数返回多值本质就是元组。
代码示例
▶ 列表基本操作
fruits = ["苹果", "香蕉"]
fruits.append("橙子")
fruits.insert(0, "葡萄")
print(fruits, len(fruits))
fruits.remove("香蕉")
print(fruits)👀 运行结果
['葡萄', '苹果', '香蕉', '橙子'] 4 ['葡萄', '苹果', '橙子']
▶ 排序与切片
scores = [88, 92, 76, 95, 60]
scores.sort(reverse=True)
print(scores)
print(scores[:3])👀 运行结果
[95, 92, 88, 76, 60] [95, 92, 88]
▶ 元组解包
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["张三"]["成绩"],注意逐层判断是否存在。
代码示例
▶ 增删改查
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}▶ 统计词频
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}▶ 遍历键值
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。
代码示例
▶ 去重与交集
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}▶ 成员判断
valid = {"admin", "teacher", "student"}
role = "admin"
print(role in valid)👀 运行结果
True
常见错误
⚠️ 踩坑与解决
TypeError: unhashable type: 'list'
→ 把列表放进集合;转成元组 tuple(lst) 再加{} 被当成空字典
→ 空集合写成了 {};用 set() 创建空集合
💡 “两个列表求共同元素”直接用 set & set,比双层循环快一个数量级。