介绍一下Python的核心数据结构

94 阅读9分钟

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)文本处理,不可修改文本存储、字符串格式化

七、核心总结(入门+面试重点)

  1. 有序 vs 无序:列表、元组、字符串是有序(支持索引/切片);集合是无序(不支持索引);字典 3.7+ 后有序,之前无序;
  2. 可变 vs 不可变:列表、字典、集合是可变(可修改元素);元组、字符串是不可变(创建后无法修改);
  3. 查询效率:字典、集合的查询效率(​​in​​ 操作)是 O(1)(哈希表实现),远高于列表、元组的 O(n);
  4. 选型原则
  • 需有序修改 → 列表;
  • 需有序不可修改 → 元组;
  • 需键值映射 → 字典;
  • 需去重/集合运算 → 集合;
  • 需处理文本 → 字符串。

掌握这 5 种核心数据结构,就能应对 Python 80% 以上的开发场景,也是面试中高频考察的基础知识点。