【Python精讲 03】Python核心容器:一篇通关序列(List, Tuple)、映射(Dict)与集合(Set)
【Python精讲 03】Python核心容器:一篇通关序列(List, Tuple)、映射(Dict)与集合(Set)
摘要:在上一篇中,我们掌握了变量、数字等“基本粒子”。现在,是时候学习如何将这些粒子组织起来了。本文将带你一篇通关Python中最核心的四大数据容器:列表(List)、元组(Tuple)、字典(Dict)和集合(Set)。我们将从它们的本质——序列、映射与集合——出发,让你彻底理解各自的特点与应用场景,学会为不同的数据选择最合适的“家”。
前言:从“砖块”到“墙壁”
如果说变量和基础数据类型是构建程序的“砖块”,那么容器就是用这些砖块砌成的“墙壁”与“房间”。它们是一种组织和存储多个数据的方式。在Python中,几乎所有的复杂数据都是由这四种基本容器或它们的变体构成的。
掌握它们,就等于掌握了Python数据结构的半壁江山。本文将摒弃零散的讲解,直接从它们的本质入手,让你形成一个清晰的知识框架。
一、序列 (Sequence):按顺序排列的数据
序列类型的核心特点是有序,其中的每一个元素都有一个唯一的、从0开始的整数索引。你可以像排队一样,通过号码(索引)精确地找到每一个人(元素)。
1.1 list
(列表):灵活的“购物清单”
列表是Python中使用最频繁的容器,它是一个可变的(mutable)、有序的序列。
- 特点:你可以随时向列表中添加、删除或修改元素,就像你可以随时更新你的购物清单一样。
- 语法:用方括号
[]
定义,元素之间用逗号,
分隔。
# 创建一个列表
fruits = ["apple", "banana", "cherry"]# 1. 访问元素 (通过索引)
print(f"第一个水果是: {fruits[0]}") # 输出: 第一个水果是: apple
print(f"最后一个水果是: {fruits[-1]}") # 输出: 最后一个水果是: cherry# 2. 修改元素
fruits[1] = "blueberry"
print(f"修改后: {fruits}") # 输出: 修改后: ['apple', 'blueberry', 'cherry']# 3. 添加元素
fruits.append("orange") # 在末尾添加
print(f"append后: {fruits}") # 输出: append后: ['apple', 'blueberry', 'cherry', 'orange']
fruits.insert(1, "grape") # 在指定索引位置插入
print(f"insert后: {fruits}") # 输出: insert后: ['apple', 'grape', 'blueberry', 'cherry', 'orange']# 4. 删除元素
removed_fruit = fruits.pop(2) # 删除指定索引的元素并返回它
print(f"pop掉的水果是: {removed_fruit}, 列表变为: {fruits}") # pop掉的水果是: blueberry, 列表变为: ['apple', 'grape', 'cherry', 'orange']
fruits.remove("cherry") # 直接删除指定的第一个匹配元素
print(f"remove后: {fruits}") # 输出: remove后: ['apple', 'grape', 'orange']# 5. 其他常用操作
print(f"列表长度: {len(fruits)}") # 输出: 列表长度: 3
print(f"'apple'在列表中吗? {'apple' in fruits}") # 输出: 'apple'在列表中吗? True```##### **1.2 `tuple` (元组):不可变的“坐标点”**元组可以看作是一个**“上了锁”的列表**。它也是一个有序的序列,但它是**不可变的(immutable)**。* **特点**:一旦创建,你就不能再修改元组中的任何元素。这使得元组非常适合存储那些不希望被意外改变的数据,比如坐标点 `(x, y)`、RGB颜色值 `(255, 0, 0)` 等。
* **语法**:用圆括号 `()` 定义。```python
# 创建一个元组
point = (120, 30)# 1. 访问元素 (和列表一样)
print(f"X坐标: {point[0]}") # 输出: X坐标: 120# 2. 尝试修改 (会报错!)
# point[0] = 100 # 这行代码会触发 TypeError# 3. 元组的“拆包” (Unpacking)
x, y = point
print(f"通过拆包得到: x={x}, y={y}") # 输出: 通过拆包得到: x=120, y=30# 注意:只有一个元素的元组,末尾必须加一个逗号
single_tuple = (5,)
print(type(single_tuple)) # <class 'tuple'>
not_a_tuple = (5)
print(type(not_a_tuple)) # <class 'int'>
二、映射 (Mapping):高效的“通讯录”
映射类型的核心是键-值(key-value)对。它不通过索引,而是通过一个唯一的“键”来快速查找对应的“值”,就像通讯录里通过人名(键)来查找电话号码(值)一样。
2.1 dict
(字典)
字典是Python中唯一的内置映射类型。它是可变的,并且在Python 3.7+版本中是有序的(按插入顺序)。
- 特点:查询速度极快,非常适合存储需要通过唯一标识符查找的信息。键必须是不可变类型(如字符串、数字、元组)。
- 语法:用花括号
{}
定义,键值对格式为key: value
。
# 创建一个字典
student = {"name": "Alice","age": 25,"courses": ["Math", "English"]
}# 1. 访问元素 (通过键)
print(f"学生姓名: {student['name']}") # 输出: 学生姓名: Alice# 2. 安全的访问方式:get()方法
# 如果键不存在,直接用[]会报错,而get()会返回None或指定的默认值
print(f"学生的年级: {student.get('grade', '暂无')}") # 输出: 学生的年级: 暂无# 3. 添加或修改元素
student['grade'] = 4 # 添加新的键值对
student['age'] = 26 # 修改已有的键值
print(f"更新后: {student}") # 输出: 更新后: {'name': 'Alice', 'age': 26, 'courses': ['Math', 'English'], 'grade': 4}# 4. 删除元素
del student['grade']
print(f"删除后: {student}") # 输出: 删除后: {'name': 'Alice', 'age': 26, 'courses': ['Math', 'English']}# 5. 遍历字典 (极其常用)
# 遍历键
for key in student.keys():print(key)
# 遍历值
for value in student.values():print(value)
# 遍历键值对
for key, value in student.items():print(f"{key}: {value}")
三、集合 (Set):独特的“朋友圈”
集合是一个可变的、无序的、且元素唯一不重复的容器。
- 特点:两大核心用途——去重和关系运算。就像一个朋友圈,里面每个人都是独一无二的,我们可以方便地计算共同好友、所有好友等。
- 语法:用花括号
{}
定义,但它不是键值对。
# 创建集合 (注意:会自动去重)
tags = {"python", "data", "web", "python"}
print(f"集合: {tags}") # 输出: 集合: {'data', 'python', 'web'} (顺序可能不同)# 1. 添加和删除元素
tags.add("ai")
print(f"add后: {tags}") # 输出: add后: {'data', 'ai', 'python', 'web'}
tags.remove("web")
print(f"remove后: {tags}") # 输出: remove后: {'data', 'ai', 'python'}# 2. 核心应用:关系运算
my_friends = {"Alice", "Bob", "Charlie"}
her_friends = {"Charlie", "David", "Eve"}# 交集 (&): 共同的好友
common_friends = my_friends & her_friends
print(f"共同好友: {common_friends}") # 输出: 共同好友: {'Charlie'}# 并集 (|): 所有的好友
all_friends = my_friends | her_friends
print(f"所有好友: {all_friends}") # 输出: 所有好友: {'Alice', 'David', 'Bob', 'Charlie', 'Eve'}# 差集 (-): 只属于我的好友
my_only_friends = my_friends - her_friends
print(f"只属于我的好友: {my_only_friends}") # 输出: 只属于我的好友: {'Alice', 'Bob'}
四、四大容器横向对比
特性 | List (列表) | Tuple (元组) | Dict (字典) | Set (集合) |
---|---|---|---|---|
定义语法 | [1, 2, 3] | (1, 2, 3) | {'a': 1, 'b': 2} | {1, 2, 3} |
可变性 | ✅ 可变 | ❌ 不可变 | ✅ 可变 | ✅ 可变 |
有序性 | ✅ 有序 | ✅ 有序 | ✅ 有序 (3.7+) | ❌ 无序 |
唯一性 | ❌ 元素可重复 | ❌ 元素可重复 | ✅ 键(Key)唯一 | ✅ 元素唯一 |
典型场景 | 存储需要增删改查的有序数据 | 存储不希望被改变的有序数据 | 存储需要快速查找的键值对数据 | 元素去重、关系运算 |
总结
今天我们学习了Python中组织数据的四种核心方式。请牢记它们的本质:
- 需要一个灵活、有序的列表?用
list
。 - 需要一个安全、不可变的列表?用
tuple
。 - 需要通过唯一的键快速查找信息?用
dict
。 - 需要处理不重复的元素或进行关系运算?用
set
。
在编程中,根据你的数据和需求,选择最合适的容器,是写出高效、清晰代码的关键一步。
预告:【Python精讲 #04】逻辑的艺术:精通if条件判断与for/while循环控制