Python 有哪些内置数据结构?
总览
| 数据结构 | 语法 | 有序 | 可变 | 允许重复 | 可哈希 |
|---|---|---|---|---|---|
list 列表 | [1, 2, 3] | ✅ | ✅ | ✅ | ❌ |
tuple 元组 | (1, 2, 3) | ✅ | ❌ | ✅ | ✅ |
dict 字典 | {"a": 1} | ✅(3.7+) | ✅ | 键唯一 | ❌ |
set 集合 | {1, 2, 3} | ❌ | ✅ | ❌ | ❌ |
frozenset 冻结集合 | frozenset({1,2}) | ❌ | ❌ | ❌ | ✅ |
str 字符串 | "hello" | ✅ | ❌ | ✅ | ✅ |
bytes 字节串 | b"hello" | ✅ | ❌ | ✅ | ✅ |
list 列表
有序、可变、允许重复,最常用的序列类型。
lst = [1, "hello", 3.14, True]
lst.append(5) # 末尾追加
lst.insert(1, "new") # 指定位置插入
lst.pop() # 删除末尾
lst.pop(0) # 删除指定索引
lst.remove("hello") # 删除第一个匹配值
lst.sort() # 原地排序
lst[0:2] # 切片
print(len(lst)) # 长度
print(3.14 in lst) # 成员检查
时间复杂度:
| 操作 | 复杂度 |
|---|---|
索引访问 lst[i] | O(1) |
末尾追加 append | O(1) 均摊 |
| 中间插入/删除 | O(n) |
搜索 in | O(n) |
tuple 元组
有序、不可变,适合存储固定记录,可作字典键。
point = (3, 4)
rgb = (255, 128, 0)
x, y = point # 解包
print(point[0]) # 索引访问
print(point.count(3)) # 计数
print(point.index(4)) # 查找索引
dict 字典
键值对映射,键唯一,Python 3.7+ 保持插入顺序。
d = {"name": "Alice", "age": 25}
d["city"] = "Beijing" # 添加/更新
d.get("height", 170) # 安全获取,默认值 170
d.pop("age") # 删除键
d.update({"age": 26}) # 批量更新
for k, v in d.items(): # 遍历键值对
print(k, v)
print("name" in d) # 键存在检查
时间复杂度:
| 操作 | 复杂度 |
|---|---|
| 查找/插入/删除 | O(1) 均摊 |
| 遍历 | O(n) |
常用技巧:
# 字典推导式
squares = {x: x**2 for x in range(5)}
# defaultdict:键不存在时自动初始化
from collections import defaultdict
dd = defaultdict(list)
dd["a"].append(1) # 不会 KeyError
# Counter:计数器
from collections import Counter
c = Counter("abracadabra")
print(c.most_common(3)) # [('a', 5), ('b', 2), ('r', 2)]
set 集合
无序、元素唯一,适合去重和集合运算。
s = {1, 2, 3, 2, 1}
print(s) # {1, 2, 3} ← 自动去重
s.add(4)
s.discard(10) # 删除不存在的元素不报错
s.remove(1) # 删除不存在的元素会报 KeyError
a = {1, 2, 3}
b = {2, 3, 4}
print(a | b) # 并集 {1, 2, 3, 4}
print(a & b) # 交集 {2, 3}
print(a - b) # 差集 {1}
print(a ^ b) # 对称差集 {1, 4}
时间复杂度:
| 操作 | 复杂度 |
|---|---|
| 添加/删除/查找 | O(1) 均摊 |
| 集合运算(并/交/差) | O(n) |
frozenset 冻结集合
不可变的集合,可作字典键或放入其他集合。
fs = frozenset({1, 2, 3})
print(fs & frozenset({2, 3, 4})) # {2, 3}
d = {frozenset({1, 2}): "pair"} # 可作字典键
str 字符串
不可变的字符序列,支持丰富的文本处理方法。
s = "Hello, Python!"
s.upper() # 大写
s.lower() # 小写
s.strip() # 去除首尾空白
s.split(", ") # 分割 → ['Hello', 'Python!']
", ".join(["a", "b"]) # 拼接 → 'a, b'
s.replace("Python", "World")
s.startswith("Hello")
s.find("Python") # 返回索引,不存在返回 -1
f"名字: {'Alice'}" # f-string 格式化
bytes 字节串
不可变的字节序列,用于网络传输、文件 I/O 等二进制场景。
b = b"hello"
b2 = "你好".encode("utf-8") # str → bytes
s = b2.decode("utf-8") # bytes → str
print(b[0]) # 104(整数)
选型建议
| 需求 | 推荐结构 |
|---|---|
| 有序、可增删的同类数据 | list |
| 固定记录、函数多返回值 | tuple |
| 键值映射、快速查找 | dict |
| 去重、集合运算 | set |
| 需要哈希的集合(作字典键) | frozenset |
| 文本处理 | str |
| 二进制数据 | bytes |
总结
Python 内置 7 种核心数据结构,覆盖序列、映射、集合三大类别:
- 序列(有序):
list、tuple、str、bytes - 映射:
dict - 集合(无序唯一):
set、frozenset
复杂场景可使用 collections 模块的增强版本:deque、defaultdict、OrderedDict、Counter、namedtuple 等。