Python 学习笔记(第五期)——组合数据类型:列表、元组、集合与字典精讲——核心知识点自测与详解
Python 学习笔记(第五期)——组合数据类型:列表、元组、集合与字典精讲——核心知识点自测与详解
本自测解析针对 Python 学习笔记系列第五期(组合数据类型:列表、元组、集合与字典精讲)的核心内容。共 10 题,每题包含题目回顾、考查知识点、详细解答与分析,帮助读者巩固 Python 组合数据类型的核心技能。
文章索引:
Python 学习笔记(第五期)——组合数据类型:列表、元组、集合与字典精讲更多自我检测系列欢迎浏览:每日知识点小问答
我的主页:AOwhisky,这里有更多运维系统性知识整理和其他有趣内容,欢迎与我一起探讨学习~
第五期:组合数据类型(第 1-5 题)
题目一:序列类型概述与索引机制
题目:Python 中的序列类型包括哪些?请说明序列类型的“双向索引”机制,并写出以下代码的输出结果。
python
text = "Python" print(text[0]) print(text[-1]) print(text[1:4]) print(text[::-1])考查知识点
- 序列类型概述 —— 第五期 §1
- 双向索引与切片 —— 第五期 §1
详细解答
序列类型包括:
| 序列类型 | 特点 | 是否可变 |
|---|---|---|
| 字符串(str) | 字符序列 | ❌ 不可变 |
| 列表(list) | 任意元素序列 | ✅ 可变 |
| 元组(tuple) | 任意元素序列 | ❌ 不可变 |
双向索引机制:
text
字符串 "Python" 的索引示例: 正向索引: 0 1 2 3 4 5 ┌────┬────┬────┬────┬────┬────┐ │ P │ y │ t │ h │ o │ n │ └────┴────┴────┴────┴────┴────┘ 反向索引: -6 -5 -4 -3 -2 -1代码输出:
python
print(text[0]) # P(正向索引第1个字符) print(text[-1]) # n(反向索引第1个字符,即最后1个) print(text[1:4]) # yth(切片:索引1到3,不包含4) print(text[::-1]) # nohtyP(步长为-1,反转字符串)题目二:列表的创建与访问
题目:请写出以下代码的输出结果,并说明列表切片[start:end:step]中三个参数的含义。
python
fruits = ["苹果", "香蕉", "橙子", "葡萄", "西瓜"] print(fruits[0]) print(fruits[-1]) print(fruits[1:4]) print(fruits[::2]) print(fruits[::-1])考查知识点
- 列表的创建与访问 —— 第五期 §2.1、§2.2
- 切片语法 —— 第五期 §2.2
详细解答
代码输出:
text
苹果 西瓜 ['香蕉', '橙子', '葡萄'] ['苹果', '橙子', '西瓜'] ['西瓜', '葡萄', '橙子', '香蕉', '苹果']切片参数含义:
| 参数 | 含义 | 示例 |
|---|---|---|
start | 起始索引(包含) | fruits[1:4]从索引1开始 |
end | 结束索引(不包含) | fruits[1:4]到索引3结束 |
step | 步长(每隔几个取一个) | fruits[::2]每隔2个取1个 |
⚠️ 注意:切片返回的是新列表,原列表不变。
[::-1]是反转列表的经典写法。
题目三:列表的添加与删除操作
题目:请写出以下代码的输出结果,并说明append()、extend()、insert()三个方法的区别。
python
numbers = [1, 2, 3] numbers.append(4) print(numbers) numbers.extend([5, 6]) print(numbers) numbers.insert(0, 0) print(numbers)考查知识点
- 列表添加元素 —— 第五期 §2.3
- 三种添加方法的区别 —— 第五期 §2.3
详细解答
代码输出:
text
[1, 2, 3, 4] [1, 2, 3, 4, 5, 6] [0, 1, 2, 3, 4, 5, 6]三种添加方法对比:
| 方法 | 作用 | 示例 | 结果 |
|---|---|---|---|
append(x) | 在末尾添加单个元素 | [1,2].append(3) | [1,2,3] |
extend(iterable) | 在末尾添加多个元素(逐个) | [1,2].extend([3,4]) | [1,2,3,4] |
insert(i, x) | 在指定位置插入元素 | [1,2,3].insert(1,99) | [1,99,2,3] |
⚠️ 易错点:
append([3,4])会将整个列表作为一个元素添加,结果为[1,2,[3,4]];而extend([3,4])会逐个添加元素,结果为[1,2,3,4]。
题目四:列表的排序与反转
题目:请写出以下代码的输出结果,并说明sort()和sorted()的区别。
python
numbers = [6, 2, 5, 3, 1, 4] numbers.sort() print(numbers) numbers.sort(reverse=True) print(numbers) original = [3, 1, 4, 1, 5] new_sorted = sorted(original) print(original) print(new_sorted)考查知识点
- 列表排序 —— 第五期 §2.5
sort()vssorted()—— 第五期 §2.5
详细解答
代码输出:
text
[1, 2, 3, 4, 5, 6] [6, 5, 4, 3, 2, 1] [3, 1, 4, 1, 5] [1, 1, 3, 4, 5]sort()vssorted()对比:
| 对比维度 | list.sort() | sorted(list) |
|---|---|---|
| 是否原地修改 | ✅ 是(修改原列表) | ❌ 否(返回新列表) |
| 返回值 | None | 排序后的新列表 |
| 适用场景 | 不需要保留原列表 | 需要保留原列表 |
其他排序方法:
| 方法 | 作用 | 示例 |
|---|---|---|
reverse() | 反转列表顺序(原地修改) | [1,2,3].reverse()→[3,2,1] |
sort(key=len) | 按指定规则排序 | 按字符串长度排序 |
题目五:列表推导式
题目:请分别用传统for循环和列表推导式生成 1 到 10 的平方数列表。列表推导式相比传统for循环有哪些优势?
考查知识点
- 列表推导式 —— 第五期 §2.6
详细解答
传统for循环:
python
squares = [] for i in range(1, 11): squares.append(i ** 2) print(squares) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]列表推导式:
python
squares = [i ** 2 for i in range(1, 11)] print(squares) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]带条件的列表推导式(扩展):
python
# 只保留 1~20 中的偶数 evens = [i for i in range(1, 21) if i % 2 == 0] print(evens) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]列表推导式的优势:
| 优势 | 说明 |
|---|---|
| 代码简洁 | 一行代码替代多行循环 |
| 可读性好 | 逻辑清晰,表达直观 |
| 性能略优 | 在简单场景下比for循环稍快 |
第五期:组合数据类型(第 6-10 题)
题目六:元组的特点与不可变性
题目:请写出以下代码的输出结果,并解释为什么(5)和(5,)的结果不同。元组有哪些主要特点?
python
t1 = (1, 2, 3) print(t1[0]) t2 = (5) t3 = (5,) print(type(t2)) print(type(t3))考查知识点
- 元组的创建与访问 —— 第五期 §3.1、§3.2
- 单元素元组的特殊写法 —— 第五期 §3.1
- 元组的不可变性 —— 第五期 §3.3
详细解答
代码输出:
text
1 <class 'int'> <class 'tuple'>为什么(5)和(5,)不同:
| 写法 | 类型 | 原因 |
|---|---|---|
(5) | int | 圆括号被解释为数学运算优先级,不是元组 |
(5,) | tuple | 逗号告诉 Python 这是元组,单元素元组必须加逗号 |
元组的主要特点:
| 特点 | 说明 |
|---|---|
| 不可变 | 一旦创建,不能增删改元素 |
| 有序 | 元素有固定顺序,支持索引和切片 |
| 可哈希 | 可以作为字典的键或集合的元素 |
| 性能更好 | 比列表占用内存更小,访问速度更快 |
题目七:集合的去重与集合运算
题目:请写出以下代码的输出结果,并说明集合的三大特性。集合中能存放列表吗?为什么?
python
s1 = set([1, 2, 2, 3, 3, 4]) print(s1) A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} print(A | B) print(A & B) print(A - B) print(A ^ B)考查知识点
- 集合的创建与去重 —— 第五期 §4.1
- 集合运算 —— 第五期 §4.3
- 集合的三大特性 —— 第五期 §1
详细解答
代码输出:
text
{1, 2, 3, 4} {1, 2, 3, 4, 5, 6, 7, 8} {4, 5} {1, 2, 3} {1, 2, 3, 6, 7, 8}集合的三大特性:
| 特性 | 含义 |
|---|---|
| 确定性 | 任何一个元素是否在集合中是确定的 |
| 互异性 | 集合中的元素互不相同(自动去重) |
| 无序性 | 集合中的元素没有顺序 |
为什么集合不能存放列表:
- 集合的元素必须是不可变类型(可哈希)
- 列表是可变类型,不能作为集合元素
- 同理,字典、集合本身也不能作为集合元素
- ✅ 可存放:数字、字符串、元组
题目八:字典的创建与访问
题目:请写出以下代码的输出结果,并说明字典的键必须满足什么条件?使用get()方法访问字典有什么好处?
python
person = {"name": "张三", "age": 18, "city": "北京"} print(person["name"]) print(person.get("city")) print(person.get("score")) print(person.get("score", 0))考查知识点
- 字典的创建与访问 —— 第五期 §5.1、§5.2
get()方法 —— 第五期 §5.2- 字典键的约束条件 —— 第五期 §5.6
详细解答
代码输出:
text
张三 北京 None 0字典键的约束条件:
| 条件 | 说明 |
|---|---|
| 唯一性 | 每个键只能对应一个值,键不能重复 |
| 不可变 | 键必须是不可变类型(字符串、数字、元组) |
| ❌不能作为键的类型 | 列表、字典、集合(可变类型) |
get()方法的优势:
| 对比 | dict[key] | dict.get(key) |
|---|---|---|
| 键不存在时 | 抛出KeyError | 返回None(或指定默认值) |
| 适用场景 | 确定键一定存在 | 键可能不存在,需要安全访问 |
题目九:字典的添加、修改与删除
题目:请写出以下代码的输出结果,并说明修改字典元素和添加字典元素在语法上有什么区别。
python
person = {"name": "张三", "age": 18} person["city"] = "北京" print(person) person["age"] = 20 print(person) person.update({"age": 22, "job": "工程师"}) print(person) del person["city"] print(person)考查知识点
- 字典元素的添加与修改 —— 第五期 §5.3
- 字典元素的删除 —— 第五期 §5.4
update()方法 —— 第五期 §5.3
详细解答
代码输出:
text
{'name': '张三', 'age': 18, 'city': '北京'} {'name': '张三', 'age': 20, 'city': '北京'} {'name': '张三', 'age': 22, 'city': '北京', 'job': '工程师'} {'name': '张三', 'age': 22, 'job': '工程师'}添加与修改的区别:
| 操作 | 语法 | 效果 |
|---|---|---|
| 添加 | dict[新键] = 值 | 键不存在时,新增键值对 |
| 修改 | dict[已存在键] = 新值 | 键已存在时,更新对应的值 |
💡 关键点:Python 字典的添加和修改使用完全相同的语法,区别仅在于键是否已存在。所以
dict[key] = value既是添加也是修改。
字典的删除方法:
| 方法 | 作用 |
|---|---|
del dict[key] | 删除指定键(键不存在时抛出KeyError) |
dict.pop(key) | 删除指定键并返回对应的值 |
dict.popitem() | 随机删除一个键值对 |
dict.clear() | 清空所有元素 |
题目十:组合数据类型对比与综合实战
题目:请从是否可变、是否有序、元素是否唯一三个维度对比list、tuple、set、dict四种数据类型。结合“十大歌手评分系统”实战,说明为什么在计算最终得分时使用列表排序比使用集合更合适?
考查知识点
- 四种数据类型对比 —— 第五期 总结
- 综合实战解析 —— 第五期 §7.1
详细解答
四种数据类型对比表:
| 类型 | 是否可变 | 是否有序 | 元素是否唯一 | 创建示例 |
|---|---|---|---|---|
| list(列表) | ✅ 可变 | ✅ 有序 | ❌ 允许重复 | [1, 2, "a"] |
| tuple(元组) | ❌ 不可变 | ✅ 有序 | ❌ 允许重复 | (1, 2, "a") |
| set(集合) | ✅ 可变 | ❌ 无序 | ✅必须唯一 | {1, 2, 3} |
| dict(字典) | ✅ 可变 | ❌ 无序(Py3.7+按插入顺序) | 键必须唯一 | {"name": "Tom"} |
为什么“十大歌手评分”使用列表而不是集合:
python
scores = [9.5, 8.8, 9.2, 7.5, 9.8, 9.0, 8.5, 9.3, 8.9, 9.1] scores.sort() valid_scores = scores[1:-1] # 去掉最高分和最低分 average = sum(valid_scores) / len(valid_scores)原因分析:
| 原因 | 说明 |
|---|---|
| 需要排序 | 集合是无序的,无法进行排序操作 |
| 需要切片 | 集合不支持切片,无法用[1:-1]去掉最高最低分 |
| 需要索引 | 集合不支持索引访问,无法获取单个元素 |
| 允许重复 | 评分可能存在相同分数,集合会自动去重,丢失数据 |
附:知识点对应总表
| 题号 | 主要考查知识点(对应笔记章节) |
|---|---|
| 1 | 第五期 §1 序列类型概述与双向索引 |
| 2 | 第五期 §2.1 列表创建;§2.2 列表访问与切片 |
| 3 | 第五期 §2.3 列表添加方法(append/extend/insert) |
| 4 | 第五期 §2.5 列表排序(sort vs sorted) |
| 5 | 第五期 §2.6 列表推导式 |
| 6 | 第五期 §3.1 元组创建;§3.3 元组不可变性 |
| 7 | 第五期 §1 集合三大特性;§4.3 集合运算 |
| 8 | 第五期 §5.1 字典创建;§5.2 字典访问与 get() |
| 9 | 第五期 §5.3 字典添加与修改;§5.4 字典删除 |
| 10 | 第五期 总结(四种类型对比);§7.1 综合实战 |
学习建议:对于答错的题目,请回看第五期对应章节,并动手在 Python 交互式环境中执行相关命令。组合数据类型是 Python 编程中最常用的数据结构,熟练掌握列表、元组、集合、字典的各自特性和适用场景,是写出高质量 Python 代码的基础。
