AIGC标识 第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() 创建空集合

八、 本篇小结与下期预告

📝 核心知识点回顾

  1. 列表:有序可变,支持索引/切片,是最通用的容器。
  2. 元组:有序不可变,性能好,可作为字典键。
  3. 字典:键值对映射,用 .get() 安全访问,.items() 遍历。
  4. 集合:无序不重复,擅长去重和集合运算。
  5. 选择原则:需要有序集合用列表,需要不可变用元组,需要映射用字典,需要去重用集合。

🚀 下期预告

掌握了数据容器,我们已经能处理结构化的数据了。接下来,我们要让代码变得“可复用”。 在《第6篇:函数——代码复用的艺术》中,我们将:

  • 学习如何定义和调用函数。
  • 掌握位置参数、关键字参数、默认参数、可变参数。
  • 理解变量的作用域(局部 vs 全局)。
  • 了解 Lambda 表达式与高阶函数入门。

💬 互动时间: 四种数据容器中,你觉得哪一个最难理解?在实际使用中,你最常用的是哪个?欢迎在评论区留言交流,博主会逐一解答!


本文属于【Python零基础入门】系列教程,欢迎关注博主,订阅专栏,带你从零开始系统掌握 Python!

posted @ 2026-09-23 14:49  奔跑的小蚂蚁9538  阅读(0)  评论(0)    收藏  举报