Python 提供了丰富且灵活的内置数据结构,用于高效地组织、存储和操作数据。这些数据结构可分为**可变(mutable)与不可变(immutable)**两大类,并根据其特性适用于不同场景。
以下是 Python 中最核心的 6 种内置数据结构的详细介绍:
1. 列表(List) ------ 可变、有序、允许重复
特点:
- 用方括号
[]定义 - 元素有序(有索引,从 0 开始)
- 允许存储不同类型的数据(如整数、字符串、对象等)
- 可变:支持增删改操作
- 允许重复元素
常见操作:
python
lst = [1, 'hello', 3.14, True]
lst.append('new') # 添加元素
lst[0] = 100 # 修改
lst.insert(1, 'x') # 在位置1插入
lst.pop() # 删除并返回最后一个元素
lst.remove('hello') # 删除第一个匹配项
len(lst) # 长度
适用场景:
- 需要动态修改的数据集合
- 保持元素插入顺序
- 频繁按索引访问或遍历
⚠️ 注意:列表在头部插入/删除效率低(O(n)),此时可考虑
collections.deque
2. 元组(Tuple) ------ 不可变、有序、允许重复
特点:
- 用圆括号
()定义(也可省略) - 元素有序、可索引
- 不可变:创建后不能修改内容
- 允许重复、可包含不同类型
示例:
python
tup = (1, 'a', 3.14)
# tup[0] = 10 # ❌ 报错!不可变
print(tup[1]) # 'a'
优势:
- 比列表更节省内存
- 可作为字典的键(因不可变)
- 线程安全(无并发修改风险)
适用场景:
- 表示固定结构的数据(如坐标
(x, y)、RGB 颜色) - 函数返回多个值
- 用作字典键或集合元素
3. 字典(Dictionary) ------ 可变、无序(Python 3.7+ 保持插入顺序)、键唯一
特点:
- 用花括号
{}定义,格式为{key: value} - 键必须是不可变类型(如 str、int、tuple)
- 值可以是任意类型
- 键唯一,重复赋值会覆盖旧值
- Python 3.7 起,字典保持插入顺序
常见操作:
python
d = {'name': 'Alice', 'age': 25}
d['city'] = 'Beijing' # 添加/修改
print(d['name']) # 访问
del d['age'] # 删除键值对
'name' in d # 检查键是否存在
d.get('height', 0) # 安全取值,不存在返回默认值
适用场景:
- 映射关系(如配置项、缓存、JSON 数据)
- 快速查找(平均 O(1) 时间复杂度)
4. 集合(Set) ------ 可变、无序、元素唯一
特点:
- 用花括号
{}定义(但空集合需用set()) - 元素无序、不重复
- 元素必须是不可变类型(如数字、字符串、元组)
- 支持数学集合运算(并、交、差、对称差)
示例:
python
s = {1, 2, 3, 3} # 自动去重 → {1, 2, 3}
s.add(4)
s.remove(1)
s.discard(10) # 不存在也不报错
# 集合运算
a = {1, 2, 3}
b = {3, 4, 5}
print(a | b) # 并集 → {1,2,3,4,5}
print(a & b) # 交集 → {3}
print(a - b) # 差集 → {1,2}
适用场景:
- 去重(如
list(set(my_list))) - 成员快速检测(
x in my_set比列表快得多) - 数学集合操作
💡 不可变集合:
frozenset------ 可作为字典键或嵌套在其他集合中
5. 字符串(String) ------ 不可变、有序、字符序列
特点:
- 用单引号
' '或双引号" "定义 - 不可变:任何"修改"操作都会生成新字符串
- 支持索引、切片、遍历
- 是 Unicode 字符序列(Python 3 默认)
常见操作:
python
s = "Hello"
s[0] # 'H'
s.upper() # 'HELLO'(返回新字符串)
'lo' in s # True
s.split() # 分割
''.join(['a','b']) # 拼接
适用场景:
- 文本处理、文件路径、用户输入等
6. 其他重要数据结构(来自标准库)
虽然不是"内置"关键字类型,但 Python 标准库提供了更专业的数据结构:
| 结构 | 所在模块 | 特点 |
|---|---|---|
deque |
collections |
双端队列,两端高效插入/删除(O(1)) |
Counter |
collections |
计数器,统计元素出现次数 |
defaultdict |
collections |
带默认值的字典,避免 KeyError |
namedtuple |
collections |
带字段名的元组,可读性更强 |
OrderedDict |
collections |
显式保持插入顺序(Python 3.7+ 普通 dict 已具备) |
heapq |
heapq |
最小堆实现,用于优先队列 |
array |
array |
存储同类型基本数据,比列表更省内存 |
示例:Counter
python
from collections import Counter
cnt = Counter(['a', 'b', 'a', 'c'])
print(cnt) # Counter({'a': 2, 'b': 1, 'c': 1})
对比总结表
| 数据结构 | 可变? | 有序? | 允许重复? | 典型用途 |
|---|---|---|---|---|
| list | ✅ | ✅ | ✅ | 通用序列,动态数组 |
| tuple | ❌ | ✅ | ✅ | 固定结构,函数返回值 |
| dict | ✅ | ✅(3.7+) | 键❌ / 值✅ | 键值映射,快速查找 |
| set | ✅ | ❌ | ❌ | 去重,成员检测,集合运算 |
| str | ❌ | ✅ | ✅ | 文本处理 |
| frozenset | ❌ | ❌ | ❌ | 不可变集合,可用作键 |
选择建议
- 需要顺序 + 可修改 →
list - 数据固定不变 →
tuple - 需要键值对应 →
dict - 只关心存在与否/去重 →
set - 处理文本 →
str - 高性能队列 →
collections.deque - 统计频次 →
collections.Counter
掌握这些数据结构及其特性,是写出高效、清晰 Python 代码的基础。