Python 的核心数据结构是内置的基础存储容器,设计简洁且功能强大,覆盖了绝大多数编程场景的需求。它们的核心特点是 “开箱即用、高效灵活” ,主要包括 列表(List)、元组(Tuple)、字典(Dictionary)、集合(Set) ,再加上基础的字符串(String),共同构成了 Python 数据处理的基石。
以下从 定义、核心特性、常用操作、适用场景 四个维度,详细介绍每个核心数据结构:
一、列表(List):有序可变的“万能容器”
1. 定义与外观
列表是 Python 最常用的数据结构,用于存储 有序、可修改 的元素集合,用方括号 [] 定义,元素之间用逗号分隔。
# 示例:存储不同类型的元素(Python 列表支持异构元素)
fruits = ["苹果", "香蕉", 100, True, 3.14]
nums = [1, 2, 3, 4, 5]
2. 核心特性
- 有序性:元素按插入顺序排列,支持通过索引(下标)访问(索引从 0 开始);
- 可变性:可动态添加、删除、修改元素(不创建新列表,直接修改原容器);
- 异构性:可存储不同类型的元素(字符串、数字、布尔值、甚至其他列表);
- 可重复:允许存储重复元素。
3. 常用操作(高频)
| 操作 | 代码示例 | 功能说明 |
|---|---|---|
| 访问元素 | fruits[0] | 获取索引 0 的元素(输出:苹果) |
| 切片(截取子列表) | nums[1:4] | 获取索引 1~3 的元素(输出:[2,3,4]) |
| 添加元素(末尾) | fruits.append("橙子") | 末尾添加元素(列表长度+1) |
| 插入元素(指定位置) | fruits.insert(1, "梨") | 在索引 1 处插入元素 |
| 删除元素(按值) | fruits.remove(100) | 删除第一个匹配的值 |
| 删除元素(按索引) | del fruits[2] | 删除索引 2 的元素 |
| 反转列表 | nums.reverse() | 原地反转列表(输出:[5,4,3,2,1]) |
| 排序 | nums.sort() | 原地升序排序(默认),sort(reverse=True) 降序 |
| 统计元素出现次数 | nums.count(3) | 统计 3 出现的次数(输出:1) |
4. 适用场景
- 存储需要按顺序访问、频繁修改的数据(如购物车商品、任务列表);
- 临时存储多个异构元素(如接口返回的混合类型数据);
- 需要动态增减元素的场景(如用户输入的多条数据)。
二、元组(Tuple):有序不可变的“安全容器”
1. 定义与外观
元组是 有序、不可修改 的元素集合,用圆括号 () 定义(单个元素需加逗号,避免歧义)。
# 示例:存储固定不变的数据
coordinates = (10.0, 20.0) # 坐标(x,y)
person_info = ("小明", 25, "北京") # 个人信息(姓名、年龄、城市)
single_tuple = (5,) # 单个元素的元组(必须加逗号)
2. 核心特性
- 有序性:与列表一致,支持索引访问和切片;
- 不可变性:创建后无法添加、删除、修改元素(若元素是可变类型如列表,可修改元素内部值,但元组结构不变);
- 异构性:支持存储不同类型元素;
- 可重复:允许重复元素;
- 轻量高效:比列表占用内存更少,访问速度更快。
3. 常用操作(高频)
| 操作 | 代码示例 | 功能说明 |
|---|---|---|
| 访问元素 | person_info[0] | 获取索引 0 的元素(输出:小明) |
| 切片(截取子元组) | person_info[1:] | 获取索引 1 及以后的元素(输出:(25, "北京")) |
| 统计元素出现次数 | (1,2,2,3).count(2) | 统计 2 出现的次数(输出:2) |
| 查找元素索引 | person_info.index("北京") | 查找元素的第一个索引(输出:2) |
4. 适用场景
- 存储固定不变的数据(如坐标、配置参数、常量);
- 函数返回多个值(本质是返回元组,可解构赋值:
name, age = func()); - 作为字典的键(元组不可变,列表不可作为字典键);
- 需要数据安全性的场景(避免误修改核心数据)。
三、字典(Dictionary):无序键值对的“映射容器”
1. 定义与外观
字典是 无序(Python 3.7+ 后保证插入顺序)、键值对(key-value) 存储的容器,用大括号 {} 定义,键(key)唯一且不可变,值(value)可任意类型。
# 示例:存储键值映射关系的数据
student = {
"id": 101,
"name": "小红",
"score": 95,
"courses": ["数学", "英语"] # 值可以是列表等可变类型
}
empty_dict = {} # 空字典
2. 核心特性
- 映射性:通过唯一的 key 快速查找 value(查询效率远高于列表);
- 键不可变:key 必须是不可变类型(字符串、数字、元组),不能是列表、字典等可变类型;
- 值可任意:value 可以是任意类型(包括字典、列表等可变类型);
- 键唯一:重复的 key 会被覆盖(后定义的生效)。
3. 常用操作(高频)
| 操作 | 代码示例 | 功能说明 |
|---|---|---|
| 访问值(按 key) | student["name"] | 获取 key 为 "name" 的值(输出:小红) |
| 安全访问值 | student.get("gender", "未知") | 无 key 时返回默认值(输出:未知) |
| 添加/修改键值对 | student["gender"] = "女" | 有 key 则修改,无 key 则添加 |
| 删除键值对 | del student["courses"] | 删除 key 为 "courses" 的键值对 |
| 获取所有 key | student.keys() | 返回所有 key 的视图(输出:dict_keys(['id','name','score','gender'])) |
| 获取所有 value | student.values() | 返回所有 value 的视图 |
| 获取所有键值对 | student.items() | 返回所有 (key, value) 元组(遍历常用) |
| 清空字典 | student.clear() | 清空所有键值对 |
4. 适用场景
- 存储具有映射关系的数据(如用户信息、配置项、接口返回的 JSON 数据);
- 需要快速通过 key 查询数据的场景(如根据 ID 查找用户);
- 存储多维度数据(如商品的名称、价格、库存等属性)。
四、集合(Set):无序唯一的“去重容器”
1. 定义与外观
集合是 无序、无重复元素 的容器,用大括号 {} 或 set() 函数定义(空集合必须用 set(),不能用 {},否则是字典)。
# 示例:存储唯一不重复的数据
tags = {"Python", "编程", "入门"} # 标签集合(自动去重)
nums = set([1, 2, 2, 3, 3, 3]) # 从列表创建集合(输出:{1,2,3})
empty_set = set() # 空集合
2. 核心特性
- 唯一性:自动去除重复元素(创建时即去重);
- 无序性:无固定顺序,不支持索引访问和切片;
- 元素不可变:集合中的元素必须是不可变类型(字符串、数字、元组),不能是列表、字典等可变类型;
- 支持集合运算:交集、并集、差集等(类似数学中的集合操作)。
3. 常用操作(高频)
| 操作 | 代码示例 | 功能说明 |
|---|---|---|
| 添加元素 | tags.add("学习") | 添加元素(已存在则不生效) |
| 删除元素(存在则删) | tags.remove("编程") | 删除元素(不存在则报错) |
| 安全删除元素 | tags.discard("Java") | 删除元素(不存在则不报错) |
| 交集(共同元素) | {1,2,3} & {2,3,4} | 输出:{2,3}(等价于 set1.intersection(set2)) |
| 并集(所有元素) | `{1,2,3} | {2,3,4}` |
| 差集(独有元素) | {1,2,3} - {2,3,4} | 输出:{1}(等价于 set1.difference(set2)) |
| 对称差集(互不相同) | {1,2,3} ^ {2,3,4} | 输出:{1,4}(等价于 set1.symmetric_difference(set2)) |
| 判断子集 | {2,3}.issubset({1,2,3}) | 判断是否是子集(输出:True) |
4. 适用场景
- 数据去重(如用户输入的重复标签、列表中的重复元素);
- 集合运算(如查找两个列表的共同元素、筛选独有元素);
- 快速判断元素是否存在(
in 操作效率远高于列表,如 if "Python" in tags)。
五、字符串(String):有序不可变的“文本容器”
字符串虽常被视为“文本类型”,但本质是 有序、不可变的字符集合,具备数据结构的核心特性,也是 Python 核心数据结构之一。
1. 定义与外观
用单引号 ''、双引号 "" 或三引号 """ """(多行文本)定义。
name = "Python"
intro = '一门简洁的编程语言'
multi_line = """第一行
第二行
第三行""" # 多行字符串
2. 核心特性
- 有序性:支持索引访问和切片(类似列表、元组);
- 不可变性:创建后无法修改单个字符(如
name[0] = "p" 会报错); - 可拼接/重复:通过
+ 拼接、* 重复生成新字符串。
3. 常用操作(高频)
| 操作 | 代码示例 | 功能说明 |
|---|---|---|
| 访问字符 | name[2] | 获取索引 2 的字符(输出:t) |
| 切片 | name[1:4] | 获取索引 1~3 的字符(输出:yth) |
| 拼接字符串 | name + " 入门" | 拼接生成新字符串(输出:Python 入门) |
| 重复字符串 | name * 2 | 重复 2 次(输出:PythonPython) |
| 查找子串 | name.find("tho") | 查找子串索引(输出:2,不存在返回 -1) |
| 替换子串 | name.replace("Python", "Java") | 替换子串(输出:Java) |
| 分割字符串 | "a,b,c".split(",") | 按分隔符分割(输出:['a','b','c']) |
| 去除首尾空格 | " hello ".strip() | 去除首尾空格(输出:hello) |
| 大小写转换 | name.lower()/upper() | 转小写/大写 |
4. 适用场景
- 存储和处理文本数据(如用户输入、文件内容、接口返回的文本);
- 字符串格式化(如拼接用户信息、生成 SQL 语句)。
六、核心数据结构对比表(面试高频)
| 数据结构 | 有序性 | 可变性 | 元素唯一性 | 核心特点 | 适用场景 |
|---|---|---|---|---|---|
| 列表(List) | 是 | 是 | 否 | 万能容器,动态增减 | 有序修改、异构元素存储 |
| 元组(Tuple) | 是 | 否 | 否 | 安全高效,不可修改 | 固定数据、函数多返回值、字典键 |
| 字典(Dict) | 是(3.7+) | 是(值可变) | 键唯一 | 键值映射,查询高效 | 映射关系数据、JSON 类数据 |
| 集合(Set) | 否 | 是(元素可增删) | 是 | 自动去重,集合运算 | 数据去重、元素存在判断、集合运算 |
| 字符串(Str) | 是 | 否 | 否 | 文本处理,不可修改 | 文本存储、字符串格式化 |
七、核心总结(入门+面试重点)
- 有序 vs 无序:列表、元组、字符串是有序(支持索引/切片);集合是无序(不支持索引);字典 3.7+ 后有序,之前无序;
- 可变 vs 不可变:列表、字典、集合是可变(可修改元素);元组、字符串是不可变(创建后无法修改);
- 查询效率:字典、集合的查询效率(
in 操作)是 O(1)(哈希表实现),远高于列表、元组的 O(n); - 选型原则:
- 需有序修改 → 列表;
- 需有序不可修改 → 元组;
- 需键值映射 → 字典;
- 需去重/集合运算 → 集合;
- 需处理文本 → 字符串。
掌握这 5 种核心数据结构,就能应对 Python 80% 以上的开发场景,也是面试中高频考察的基础知识点。