第5篇:《Python 数据容器——列表、元组、字典与集合》
【Python零基础入门】第5篇:《Python 数据容器——列表、元组、字典与集合》
导语: 在前面的课程中,我们学习了变量和基本运算。但如果要存储全班50个同学的成绩,难道要定义
score1, score2, ... score50这50个变量吗?显然不现实。 今天,我们将学习 Python 中最核心的四大数据容器:列表(List)、元组(Tuple)、字典(Dict)和集合(Set)。它们是组织和管理数据的基石,掌握了它们,你才算真正踏入了 Python 编程的大门!
一、 列表(List):最常用的有序容器
列表是 Python 中使用最频繁的数据类型,它是一个有序的、可变的元素集合,用方括号 [] 表示。
1. 创建与访问
# 创建列表
fruits = ["apple", "banana", "cherry"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "hello", True, 3.14] # 可以存储不同类型的数据
# 通过索引访问(从0开始)
print(fruits[0]) # apple
print(fruits[-1]) # cherry(负索引表示从末尾倒数)
# 切片操作 [start:stop:step]
print(numbers[1:4]) # [2, 3, 4]
print(numbers[::-1]) # [5, 4, 3, 2, 1](反转列表)
2. 常用增删改查操作
lst = [10, 20, 30]
# ➕ 增加
lst.append(40) # 末尾添加 → [10, 20, 30, 40]
lst.insert(1, 15) # 在索引1处插入 → [10, 15, 20, 30, 40]
lst.extend([50, 60]) # 批量追加 → [10, 15, 20, 30, 40, 50, 60]
# ✏️ 修改
lst[0] = 99 # 修改索引0的值 → [99, 15, 20, 30, 40, 50, 60]
# 🗑️ 删除
lst.remove(30) # 按值删除第一个匹配项
popped = lst.pop() # 弹出并返回最后一个元素(默认末尾)
del lst[0] # 按索引删除
# 🔍 查询
print(len(lst)) # 获取长度
print(20 in lst) # 判断元素是否存在 → True/False
print(lst.index(15)) # 查找元素的索引位置
💡 核心特性:列表是可变(Mutable) 的,你可以随时修改它的内容,而不会改变其在内存中的地址。
二、 元组(Tuple):不可变的“安全列表”
元组与列表非常相似,但它是不可变的,用小括号 () 表示。一旦创建,就不能增删改。
1. 基本用法
# 创建元组
point = (3, 4)
single = (42,) # ⚠️ 注意:只有一个元素的元组必须加逗号!
empty = () # 空元组
# 访问方式与列表完全相同
print(point[0]) # 3
print(point[1:]) # (4,)
2. 为什么需要元组?
既然列表能做所有事,为什么还要有元组?
- 安全性:不可变意味着数据不会被意外修改,适合作为配置项、数据库记录等。
- 性能更好:创建速度和迭代速度都比列表快,占用内存更少。
- 可作为字典的键:因为不可变(可哈希),元组可以作为 dict 的 key,而列表不行。
# ✅ 合法:元组作为字典的键
locations = {(35.68, 139.69): "Tokyo", (40.71, -74.00): "New York"}
# ❌ 报错:列表不能作为字典的键
# locations = {[35.68, 139.69]: "Tokyo"} # TypeError: unhashable type: 'list'
三、 字典(Dict):键值对的映射关系
字典是 Python 中最重要的数据结构之一,它以键值对(Key-Value) 的形式存储数据,用花括号 {} 表示。字典是无序的(Python 3.7+ 保持插入顺序,但逻辑上仍视为映射而非序列)。
1. 创建与访问
student = {
"name": "Alice",
"age": 22,
"scores": [90, 85, 92]
}
# 通过键访问值
print(student["name"]) # Alice
print(student.get("gender", "未知")) # 未知(键不存在时返回默认值,不会报错)
⚠️ 关键区别:
dict[key]在键不存在时会抛出KeyError;而dict.get(key, default)会安全地返回默认值。推荐优先使用.get()方法!
2. 常用操作
d = {"a": 1, "b": 2}
# ➕ 增加 / ✏️ 修改
d["c"] = 3 # 新增键值对
d["a"] = 10 # 修改已有键的值
d.update({"b": 20, "d": 4}) # 批量更新
# 🗑️ 删除
del d["a"] # 按键删除
val = d.pop("b") # 弹出并返回值
# 🔍 遍历字典
for key in d: # 遍历键
print(key)
for key, value in d.items(): # 同时遍历键和值(最常用)
print(f"{key}: {value}")
for value in d.values(): # 只遍历值
print(value)
四、 集合(Set):去重与集合运算
集合是一个无序的、不重复的元素容器,也用花括号 {} 表示(但没有键值对)。它的核心作用是去重和数学集合运算。
1. 基本用法
# 创建集合
s = {1, 2, 3, 2, 1}
print(s) # {1, 2, 3} ← 自动去重!
# ⚠️ 创建空集合必须用 set(),不能用 {}({} 创建的是空字典)
empty_set = set()
2. 集合运算(数学中的交集、并集、差集)
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a & b) # 交集: {3, 4}
print(a | b) # 并集: {1, 2, 3, 4, 5, 6}
print(a - b) # 差集 (a有b没有): {1, 2}
print(a ^ b) # 对称差集 (不同时属于两者): {1, 2, 5, 6}
💡 典型应用场景:快速去除列表中的重复元素。
names = ["Alice", "Bob", "Alice", "Charlie", "Bob"] unique_names = list(set(names)) # ['Alice', 'Bob', 'Charlie'](注意:顺序可能改变)
五、 四大容器对比总结
| 特性 | 列表 List | 元组 Tuple | 字典 Dict | 集合 Set |
|---|---|---|---|---|
| 符号 | [] |
() |
{k: v} |
{} / set() |
| 有序性 | ✅ 有序 | ✅ 有序 | ⚠️ 插入有序(3.7+) | ❌ 无序 |
| 可变性 | ✅ 可变 | ❌ 不可变 | ✅ 可变(值) | ✅ 可变 |
| 重复元素 | ✅ 允许 | ✅ 允许 | ❌ 键不可重复 | ❌ 不允许 |
| 索引访问 | ✅ 支持 | ✅ 支持 | ❌ 按键访问 | ❌ 不支持 |
| 典型用途 | 通用数据集合 | 配置/记录/字典键 | 映射关系/JSON | 去重/集合运算 |
六、 实战演练:学生成绩管理系统(迷你版)
综合运用列表和字典,实现一个简单的成绩管理功能:
# 学生成绩数据(列表嵌套字典)
students = [
{"name": "Alice", "score": 92},
{"name": "Bob", "score": 78},
{"name": "Charlie", "score": 88},
{"name": "Diana", "score": 95},
]
# 1. 计算平均分
total = sum(s["score"] for s in students)
avg = total / len(students)
print(f"📊 班级平均分:{avg:.1f}")
# 2. 找出最高分的学生
top_student = max(students, key=lambda s: s["score"])
print(f"🏆 最高分:{top_student['name']} ({top_student['score']}分)")
# 3. 筛选及格学生(>=80分)
passed = [s["name"] for s in students if s["score"] >= 80]
print(f"✅ 优秀名单(≥80分):{', '.join(passed)}")
# 4. 添加新学生
students.append({"name": "Eve", "score": 85})
print(f"👥 当前学生人数:{len(students)}")
运行结果:
📊 班级平均分:88.2
🏆 最高分:Diana (95分)
✅ 优秀名单(≥80分):Alice, Charlie, Diana
👥 当前学生人数:5
七、 新手避坑指南
| 常见错误 | 原因分析 | 正确做法 |
|---|---|---|
IndexError: list index out of range |
访问了超出列表范围的索引 | 先用 len() 检查长度,或使用 try-except |
KeyError: 'xxx' |
用 [] 访问字典中不存在的键 |
改用 .get(key, default) 方法 |
TypeError: unhashable type: 'list' |
将列表用作字典的键或集合的元素 | 改用元组,或确保元素是不可变类型 |
| 修改正在遍历的列表 | 在 for 循环中直接 remove 元素 |
创建副本遍历,或用列表推导式生成新列表 |
{} 创建空集合 |
{} 创建的是空字典,不是空集合 |
使用 set() 创建空集合 |
八、 本篇小结与下期预告
📝 核心知识点回顾
- 列表:有序可变,支持索引/切片,是最通用的容器。
- 元组:有序不可变,性能好,可作为字典键。
- 字典:键值对映射,用
.get()安全访问,.items()遍历。 - 集合:无序不重复,擅长去重和集合运算。
- 选择原则:需要有序集合用列表,需要不可变用元组,需要映射用字典,需要去重用集合。
🚀 下期预告
掌握了数据容器,我们已经能处理结构化的数据了。接下来,我们要让代码变得“可复用”。 在《第6篇:函数——代码复用的艺术》中,我们将:
- 学习如何定义和调用函数。
- 掌握位置参数、关键字参数、默认参数、可变参数。
- 理解变量的作用域(局部 vs 全局)。
- 了解 Lambda 表达式与高阶函数入门。
💬 互动时间: 四种数据容器中,你觉得哪一个最难理解?在实际使用中,你最常用的是哪个?欢迎在评论区留言交流,博主会逐一解答!
本文属于【Python零基础入门】系列教程,欢迎关注博主,订阅专栏,带你从零开始系统掌握 Python!

浙公网安备 33010602011771号