Python四大容器核心操作速查表(全面版·v1.7 - 2025年11月7日修订)

Python四大容器核心操作速查表(全面版·v1.7 - 2025年11月7日修订)

📌 使用说明

  • 时间复杂度:O(1)=常数级(快),O(n)=线性级(随数据量增长),O(k)=取决于传入可迭代对象长度
  • 🔴 不可变容器 (元组)的增删改操作均为"间接实现",直接操作会报错
  • 🔵 可变容器 (列表/字典/集合)支持原地修改,部分方法带_update后缀为"原地操作"
  • ⚠️ 通用警告:可变容器嵌套结构需注意浅拷贝陷阱,建议使用copy.deepcopy()处理多层嵌套

一、容器特性总览表

容器类型 核心特性 增删改查效率 适用场景 可哈希性 有序性说明
列表(list) 可变、允许重复 末尾O(1)/中间O(n)、查索引O(1)/inO(n) 动态有序数据、频繁修改 ❌ 不可哈希 索引有序:通过0-based索引访问,顺序固定
元组(tuple) 不可变、允许重复 增删改受限、查索引O(1) 静态数据、函数返回值、字典键 可哈希(前提是所有元素均为可哈希类型;含嵌套可变对象时不可哈希,如(1, [2]) 索引有序:创建后顺序不可变,可作字典键
字典(dict) 可变、键唯一 O(1)平均(哈希表),最坏哈希冲突O(n) 键值映射、快速查找 ❌ 不可哈希 3.7+插入序:按键值对插入顺序保存,但不支持索引访问
集合(set) 可变、元素唯一 O(1)平均(哈希表),最坏哈希冲突O(n) 去重、集合关系判断 ❌ 不可哈希 无序:底层哈希表实现,无固定顺序

二、列表(list)操作速查

操作类型 具体操作 语法示例 功能描述 时间复杂度 注意事项
append() lst.append(x) 末尾添加单个元素 O(1) 🔵 原地修改;支持嵌套
extend() lst.extend(iterable) 批量添加可迭代对象元素 O(k) 🔵 原地修改;append()关键区别append([4,5])添加后长度+1(嵌套列表),extend([4,5])添加后长度+2(拆解元素);传入字符串会拆分为单个字符append("ab") 新增元素 "ab"extend("ab") 新增 'a''b'
insert() lst.insert(i, x) 指定位置插入元素 O(n) 🔵 后续元素后移;索引越界插入末尾
拼接 lst1 + lst2 返回新列表(原列表不变) O(n+k) ⚠️ 非原地操作,内存开销大
remove() lst.remove(x) 删除第一个匹配元素 O(n) 🔵 元素不存在报错ValueError
pop() lst.pop(i=-1) 删除并返回指定位置元素 O(n) 🔵 默认删末尾;空列表报错
del del lst[i] / del lst[s:e] 按索引/切片删除 O(n) 🔵 无返回值;支持批量删除
clear() lst.clear() 清空所有元素 O(n) 🔵 保留列表对象;不同 Python 解释器实现可能有差异,通用标注为 O(n),实际部分环境(如 CPython)中效率更高
推导式过滤 [x for x in lst if cond] 条件筛选保留元素 O(n) ⚠️ 非原地,创建新列表
索引赋值 lst[i] = x 修改指定位置元素 O(1) 🔵 支持负索引
切片赋值 lst[s:e] = iterable 批量替换元素 O(k) 🔵 可改变长度;步长≠1时长度需匹配;示例lst[::2] = [5,6] 正确,lst[::2] = [5] 错误(ValueError)
索引访问 lst[i] / lst[-1] 获取指定位置元素 O(1) 负索引表示倒数
切片访问 lst[s:e:step] 获取子列表 O(k) 返回新列表;[::-1]反转
index() lst.index(x, start, end) 查找元素首次出现索引 O(n) 不存在报错;支持范围查找
count() lst.count(x) 统计元素出现次数 O(n) 不存在返回0
in x in lst 判断元素是否存在 O(n) 效率低于dict/set
进阶 sort() lst.sort(key, reverse) 原地排序(升序默认) O(n log n) 🔵 修改原列表;元素需同类型
sorted() sorted(lst, key, reverse) 返回新排序列表 O(n log n) ⚠️ 原列表不变
reverse() lst.reverse() 原地反转列表 O(n) 🔵 修改原列表
浅拷贝 lst.copy() / lst[:] 复制外层元素 O(n) ⚠️ 嵌套容器共享引用;copy()是内置方法调用,切片通过新建对象复制元素,两者实现机制略有差异但效率相近
深拷贝 copy.deepcopy(lst) 完全独立复制 O(n) 需导入copy模块
enumerate() for i, x in enumerate(lst) 遍历索引+元素 O(n) start参数控制索引起始值

三、元组(tuple)操作速查

操作类型 具体操作 语法示例 功能描述 时间复杂度 注意事项
拼接 tup1 + tup2 🔴 生成新元组(原元组不变) O(n+k) 不可原地添加
重复 tup * n 🔴 重复拼接生成新元组 O(n*k) 边界值说明n=0 时返回空元组,n=1 时返回原元组副本,n<0 报错 ValueError
拆包 a, b, *rest = tup 🔴 批量赋值变量 O(k) *接收剩余元素;_可忽略
del del tup 🔴 删除整个元组对象 O(1) 不支持删除单个元素
可变元素修改 tup[i][j] = x 🔴 仅可修改内部可变对象内容 O(1) ⚠️ 副作用警告:修改会影响所有引用该可变对象的变量,需谨慎
索引访问 tup[i] / tup[-1] 获取指定位置元素 O(1) 与列表完全一致
切片访问 tup[s:e:step] 获取子元组 O(k) 返回新元组
index() tup.index(x, start, end) 查找元素首次索引 O(n) 不存在报错
count() tup.count(x) 统计元素出现次数 O(n) 不存在返回0
in x in tup 判断元素是否存在 O(n) 同列表
进阶 namedtuple Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
创建命名字段元组 O(1) 通过属性访问:p.x返回1;p.y返回2,比索引更清晰
类型转换 list(tup) / tuple(lst) 与list/set互转 O(n) 转set会丢失顺序
作字典键 dic = {(1,2): "A点"} 利用不可变性 O(1) 需确保元组为可哈希类型(参考容器特性总览表)

四、字典(dict)操作速查

操作类型 具体操作 语法示例 功能描述 时间复杂度 注意事项
键赋值 dic[k] = v 添加/更新键值对(键存在则覆盖) O(1)平均 🔵 最常用方式;键必须可哈希(不可变类型,如数字/字符串/元组;列表/集合等可变类型会报错TypeError: unhashable type
update() dic.update(dic2) / dic.update([(k,v)]) / dic.update(k=v) 批量添加/更新(支持字典/可迭代对象/关键字参数) O(k) 🔵 灵活性高;后传入的相同键覆盖前值
|= dic1 |= dic2 🔵 合并字典(原地) O(k) Python 3.9+;相同键取后者
setdefault() dic.setdefault(k, default) 键不存在时添加并返回默认值 O(1)平均 键已存在则返回原值
推导式 {k:v for k,v in iter} 批量生成键值对 O(n) 支持条件过滤
fromkeys() dict.fromkeys(seq, v) 创建键来自序列的字典 O(k) ⚠️ 可变值会共享引用所有键;避免方法:{k: [] for k in seq}
pop() dic.pop(k, default) 删除键并返回值(可设默认值) O(1)平均 🔵 不存在且无default报错KeyError
popitem() dic.popitem() 删除并返回最后插入的键值对 O(1)平均 🔵 Python 3.7+有序;空字典报错
del del dic[k] 删除指定键 O(1)平均 🔵 键不存在报错KeyError
clear() dic.clear() 清空所有键值对 O(n) 🔵 保留字典对象
推导式过滤 {k:v for k,v in dic.items() if cond} 条件保留键值对 O(n) ⚠️ 创建新字典
键赋值 dic[k] = 新值 修改已存在键的值 O(1)平均 🔵 键不存在则为新增
update() dic.update({k:新值}) 批量修改值 O(k) 🔵 键存在则更新
改键名 dic[新k] = dic.pop(旧k) 间接修改键名(值不变) O(1)平均 🔵 先删后增,原子操作
键访问 dic[k] 获取键对应的值 O(1)平均 不存在报错KeyError
get() dic.get(k, default) 安全获取值(可设默认值) O(1)平均 推荐用法;不存在不报错
in k in dic 判断键是否存在(底层调用dic.__contains__(k),等价但前者更常用) O(1)平均 只查键,不查值
items() items_view = dic.items() / for k,v in dic.items() 获取键值对视图的引用 O(1) 获取视图对象本身为O(1);遍历视图的时间复杂度为O(n)
keys() keys_view = dic.keys() / for k in dic.keys() 获取键的视图引用 O(1) 获取视图对象本身为O(1);遍历视图的时间复杂度为O(n)
values() values_view = dic.values() / for v in dic.values() 获取值的视图引用 O(1) 获取视图对象本身为O(1);遍历视图的时间复杂度为O(n)
查值存在 v in dic.values() 判断值是否存在(需遍历) O(n) 效率低;原字典值唯一时适用反向字典{v:k for k,v in dic.items()};若值重复需保留所有键,可使用 from collections import defaultdict; rev_dic = defaultdict(list); for k, v in dic.items(): rev_dic[v].append(k)
进阶 遍历 for k in dic: / for k,v in dic.items(): 多种遍历方式 O(n) 默认遍历键;items()最常用
sorted() sorted(dic, key=lambda k: dic[k]) 按键/值排序 O(n log n) 返回键列表;需指定key
深拷贝 copy.deepcopy(dic) 完全独立复制 O(n) ⚠️ 嵌套结构必须深拷贝
defaultdict defaultdict(list) 自动初始化默认值 O(1)平均 需导入 from collections import defaultdict示例:统计单词频率时dd['apple'] += 1无需提前判断键是否存在;场景:需自动初始化键对应的值(如列表、计数器)
视图特性 view = dic.items() 动态关联原字典 O(1) 修改原字典,视图同步更新

五、集合(set)操作速查

操作类型 具体操作 语法示例 功能描述 时间复杂度 注意事项
add() s.add(x) 添加单个元素(去重) O(1)平均 🔵 重复元素自动忽略
update() s.update(iterable) 批量添加元素(自动去重) O(k)平均 🔵 字符串会被拆分字符
推导式 {x for x in iter if cond} 条件生成集合 O(n) 自动去重
discard() s.discard(x) 删除元素(不存在不报错) O(1)平均 🔵 推荐优先使用
remove() s.remove(x) 删除元素(不存在报错) O(1)平均 🔵 报错KeyError
pop() s.pop() 随机删除并返回一个元素 O(1)平均 🔵 空集合报错;无法指定位置
clear() s.clear() 清空所有元素 O(n) 🔵 保留集合对象
间接修改 s.discard(x); s.add(y) 先删后增实现修改 O(1)平均 🔴 无直接修改方法
in x in s 判断元素是否存在 O(1)平均 核心优势,远快于list
遍历 for x in s: 遍历所有元素 O(n) 顺序不确定
集合运算 交集 s1 & s2 / s1.intersection(s2) 返回共同元素 O(min(len)) 支持多集合:s1 & s2 & s3;最坏情况O(n);原地方法s1.intersection_update(s2)(修改s1)
并集 s1 | s2 / s1.union(s2) 返回所有元素(去重) O(len(s1)+len(s2)) 支持多集合;原地方法s1.update(s2) 或 `s1
差集 s1 - s2 / s1.difference(s2) 返回仅在s1的元素 O(len(s1)) s2 - s1结果不同;原地方法s1.difference_update(s2)
对称差集 s1 ^ s2 / s1.symmetric_difference(s2) 返回仅在一个集合的元素 O(len(s1)+len(s2)) 即并集减交集;原地方法s1.symmetric_difference_update(s2)
子集判断 s1 <= s2 / s1.issubset(s2) 判断s1是否为s2子集 O(len(s1)) <为真子集(s1≠s2)
超集判断 s1 >= s2 / s1.issuperset(s2) 判断s1是否为s2超集 O(len(s2)) >为真超集(s1≠s2)
无交集判断 s1.isdisjoint(s2) 判断两集合是否无交集 O(min(len)) 有交集返回False,无交集返回True
进阶 frozenset fs = frozenset({1,2,3}) 创建不可变集合 O(n) ✅ 可哈希,可作字典键
类型转换 list(s) / tuple(s) 转列表/元组(无序) O(n) ⚠️ 顺序不确定,每次可能不同
去重应用 set(lst) 列表去重最高效方式 O(n)平均 转回列表需用list(set(lst)),但会丢失原顺序保留原顺序的去重可使用 list(dict.fromkeys(lst))(Python 3.7+,时间复杂度 O(n))
空集合 s = set() 创建空集合 O(1) ⚠️ {}是空字典,不是集合

六、通用操作与最佳实践

操作类型 语法示例 适用范围 说明
长度 len(container) list/tuple/dict/set O(1)获取元素个数
最值 max(c) / min(c) list/tuple/set 元素需可比较;dict只比较键
求和 sum(c) list/tuple/set 仅限数字元素;dict只累加键
迭代器 iter(c) + next() 所有容器 手动控制迭代过程
空判断 if not c: list/tuple/dict/set 空容器为False,推荐方式
浅拷贝陷阱 c.copy() / c[:] list/tuple/dict/set ⚠️ 嵌套结构示例lst=[1,[2]]; lst2=lst.copy(); lst2[1][0]=99会导致lst也被修改
深拷贝解决 copy.deepcopy(c) 完全独立复制
元素类型限制 - dict键/set元素 必须可哈希(数字/字符串/元组/frozenset等不可变类型)

七、选型决策树与性能优先级

需要存储数据?
├── 是否需要键值对映射?
│   ├── 是 → 字典(dict)
│   └── 否 → 是否需要去重?
│       ├── 是 → 集合(set)
│       └── 否 → 是否需要修改?
│           ├── 是 → 列表(list)
│           └── 否 → 元组(tuple)(更省内存、安全)

性能优先级

  • 查找最多:字典 > 集合 > 列表(O(1) vs O(n))
  • 修改最多按位置修改场景:列表 > 字典 > 集合(列表支持索引直接修改);按查找后修改场景:字典 > 集合 > 列表(哈希表查找效率更高)
  • 内存最省:元组 > 列表 > 字典/集合(哈希表额外开销)
  • 安全性
    • 结构安全性(避免容器本身被意外修改):元组(不可变)> 深拷贝后的可变容器
    • 数据独立性(避免嵌套对象跨引用修改):深拷贝后的容器 > 元组(含嵌套可变对象时)

最坏情况提醒

  • 字典/集合:哈希冲突严重时,操作可能退化为O(n)
  • 集合运算:集合大小差异极大时,交集运算接近O(min(len))
posted @ 2025-11-07 08:41  wangya216  阅读(18)  评论(0)    收藏  举报