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() vs sorted() 对比:
| 对比维度 | 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 代码的基础。
--- Compiled and Authored by Whisky --- July 22 nd, 2026