Python四大容器核心操作速查表(全面版)
说明
- 时间复杂度标注:O(1)=常数级(快),O(n)=线性级(随数据量增长),O(k)=取决于传入可迭代对象长度
- 🔴 不可变容器(元组)的增删改操作均为“间接实现”,直接操作会报错
- 🔵 可变容器(列表/字典/集合)支持原地修改,部分方法带
_update后缀为“原地操作”
一、列表(list):有序可变、允许重复
| 操作类型 | 具体操作 | 语法示例 | 功能描述 | 时间复杂度 | 注意事项 |
|---|---|---|---|---|---|
| 增 | 末尾添加单个元素 | lst.append(x) |
在列表末尾添加元素x | O(1) | 支持嵌套容器(如列表、元组) |
| 增 | 批量添加元素 | lst.extend(iterable) |
批量添加可迭代对象(列表/元组/字符串)的所有元素 | O(k) | 字符串会按字符拆分 |
| 增 | 指定位置插入元素 | lst.insert(index, x) |
在索引index处插入元素x,后续元素后移 | O(n) | index超范围则插入到首尾 |
| 增 | 列表拼接 | new_lst = lst1 + lst2 |
拼接两个列表,返回新列表 | O(n+k) | 原列表不变 |
| 删 | 删除首个匹配元素 | lst.remove(x) |
删除列表中第一个出现的x,无返回值 | O(n) | x不存在报错ValueError |
| 删 | 删除指定索引元素 | lst.pop(index=-1) |
删除索引index处元素(默认末尾),返回该元素 | O(n) | index超范围报错IndexError |
| 删 | 按索引/切片删除 | del lst[index] / del lst[start:end] |
删除指定索引或切片区间元素,无返回值 | O(n) | 可直接del lst删除整个列表 |
| 删 | 清空列表 | lst.clear() |
清空所有元素,保留列表对象 | O(n) | 结果为[],列表仍可复用 |
| 删 | 过滤删除(间接) | lst = [x for x in lst if 条件] |
保留符合条件的元素,间接删除其他元素 | O(n) | 生成新列表,原列表被覆盖 |
| 改 | 直接修改指定索引 | lst[index] = 新值 |
修改索引index处的元素值 | O(1) | 支持负索引(如-1表示末尾) |
| 改 | 切片批量修改 | lst[start:end] = 可迭代对象 |
批量替换切片区间元素,可改变列表长度 | O(k) | 赋值为空列表等价于删除该区间 |
| 查 | 索引查找 | lst[index] |
获取索引index处的元素 | O(1) | 索引超范围报错IndexError |
| 查 | 切片查找 | lst[start:end:step] |
获取切片区间子列表,返回新列表 | O(k) | step=1默认,step=-1反转列表 |
| 查 | 查找元素索引 | lst.index(x, start=0, end=len(lst)) |
返回第一个x的索引,支持指定查找范围 | O(n) | x不存在报错ValueError |
| 查 | 统计元素出现次数 | lst.count(x) |
返回元素x在列表中出现的次数 | O(n) | x不存在返回0 |
| 进阶 | 原地排序 | lst.sort(key=None, reverse=False) |
按规则排序(key为排序函数),修改原列表 | O(n log n) | reverse=True降序,默认升序 |
| 进阶 | 排序返回新列表 | sorted(lst, key=None, reverse=False) |
返回排序后的新列表,原列表不变 | O(n log n) | 支持所有可迭代对象 |
| 进阶 | 原地反转 | lst.reverse() |
反转列表元素顺序,修改原列表 | O(n) | 无返回值,直接修改原列表 |
| 进阶 | 浅拷贝 | lst.copy() / lst[:] |
复制外层元素,嵌套容器为引用 | O(n) | 修改嵌套元素会影响原列表 |
| 进阶 | 深拷贝 | copy.deepcopy(lst) |
完全复制所有层级元素,内外独立 | O(n) | 需导入import copy |
| 其他 | 获取长度 | len(lst) |
返回列表元素个数 | O(1) | 空列表返回0 |
| 其他 | 判断元素存在 | x in lst / x not in lst |
判断x是否在列表中 | O(n) | 数据量大时效率低,建议用字典/集合 |
| 其他 | 最值/求和 | max(lst) / min(lst) / sum(lst) |
获取最大值/最小值/数字元素和 | O(n) | 元素需可比较,非数字元素求和报错 |
二、元组(tuple):有序不可变、允许重复
| 操作类型 | 具体操作 | 语法示例 | 功能描述 | 时间复杂度 | 注意事项 |
|---|---|---|---|---|---|
| 增 | 元组拼接(间接) | new_tup = tup1 + tup2 |
拼接两个元组,返回新元组 | O(n+k) | 原元组不变,单元素元组需加逗号((x,)) |
| 增 | 重复拼接(间接) | new_tup = tup * n |
重复元组n次,返回新元组 | O(n*k) | n为非负整数,n=0返回空元组 |
| 删 | 删除整个元组(间接) | del tup |
删除整个元组对象,后续无法访问 | O(1) | 无法删除单个元素,报错TypeError |
| 改 | 修改嵌套可变元素(间接) | tup[index][子索引] = 新值 |
仅当元组包含列表/字典时,可修改其内部元素 | O(1) | 元组本身的引用不变,仅修改嵌套元素内容 |
| 查 | 索引查找 | tup[index] |
获取索引index处的元素 | O(1) | 支持正/负索引,超范围报错IndexError |
| 查 | 切片查找 | tup[start:end:step] |
获取切片区间子元组,返回新元组 | O(k) | 与列表切片规则一致 |
| 查 | 查找元素索引 | tup.index(x, start=0, end=len(tup)) |
返回第一个x的索引,支持指定查找范围 | O(n) | x不存在报错ValueError |
| 查 | 统计元素出现次数 | tup.count(x) |
返回元素x在元组中出现的次数 | O(n) | x不存在返回0 |
| 进阶 | 元组拆包 | a, b, *rest = tup |
批量赋值变量,*rest接收剩余元素(列表) |
O(n) | 可用_忽略不需要的元素 |
| 进阶 | 类型转换 | list(tup) / set(tup) / str(tup) |
转为列表(可变)/集合(去重)/字符串 | O(n) | 转集合会丢失有序性,转字符串含括号 |
| 其他 | 获取长度 | len(tup) |
返回元组元素个数 | O(1) | 空元组为(),长度0 |
| 其他 | 最值/求和 | max(tup) / min(tup) / sum(tup) |
获取最大值/最小值/数字元素和 | O(n) | 元素需可比较,非数字元素求和报错 |
| 其他 | 判断元素存在 | x in tup / x not in tup |
判断x是否在元组中 | O(n) | 数据量大时效率低 |
三、字典(dict):有序(3.7+)可变、键唯一不可变
| 操作类型 | 具体操作 | 语法示例 | 功能描述 | 时间复杂度 | 注意事项 |
|---|---|---|---|---|---|
| 增 | 直接添加键值对 | dic[key] = value |
键不存在则添加,存在则覆盖 | O(1) | 键必须是不可变类型(数字/字符串/元组) |
| 增 | 批量添加/更新 | dic.update(other) |
批量添加字典/键值对列表/关键字参数 | O(k) | 关键字参数的键需为合法标识符 |
| 增 | 带默认值添加 | dic.setdefault(key, default=None) |
键不存在则添加(key:default),返回default;存在则返回原值 | O(1) | default默认None,不覆盖已有值 |
| 增 | 批量创建字典 | dict.fromkeys(seq, value=None) |
以seq元素为键,value为默认值创建新字典 | O(k) | value为可变对象时,所有键共享该对象 |
| 增 | 字典推导式 | new_dic = {k:v for k,v in 可迭代对象 if 条件} |
按规则生成新字典,自动去重键 | O(n) | 键重复时保留最后一个值 |
| 删 | 删除指定键 | dic.pop(key, default=None) |
删除key,返回对应值;不存在则返回default | O(1) | 无default且key不存在报错KeyError |
| 删 | 删除最后一个键值对 | dic.popitem() |
删除并返回最后一个键值对(元组形式) | O(1) | 空字典调用报错KeyError |
| 删 | 按键删除 | del dic[key] |
删除指定键值对,无返回值 | O(1) | key不存在报错KeyError |
| 删 | 清空字典 | dic.clear() |
清空所有键值对,保留字典对象 | O(n) | 结果为{}, 字典仍可复用 |
| 删 | 过滤删除(间接) | new_dic = {k:v for k,v in dic.items() if 条件} |
保留符合条件的键值对,生成新字典 | O(n) | 原字典不变 |
| 改 | 直接修改键值 | dic[key] = 新值 |
修改已有键的值 | O(1) | key必须已存在 |
| 改 | 批量修改 | dic.update(other) |
批量更新已有键的值,不存在则添加 | O(k) | 与“批量添加”语法一致,功能兼容 |
| 改 | 修改键名(间接) | dic[新键] = dic.pop(旧键) |
先删除旧键并获取值,再添加新键 | O(1) | 新键不存在时生效,存在则覆盖 |
| 查 | 直接键访问 | dic[key] |
获取key对应的值 | O(1) | key不存在报错KeyError |
| 查 | 安全查找(带默认值) | dic.get(key, default=None) |
获取key对应的值,不存在则返回default | O(1) | 推荐优先使用,避免报错 |
| 查 | 遍历键值对 | for k,v in dic.items() |
迭代所有键值对,返回dict_items视图 | O(n) | 视图动态关联原字典,修改原字典会同步更新 |
| 查 | 遍历键 | for k in dic.keys() / for k in dic |
迭代所有键,返回dict_keys视图 | O(n) | 后者为简化写法,等价于前者 |
| 查 | 遍历值 | for v in dic.values() |
迭代所有值,返回dict_values视图 | O(n) | 值允许重复 |
| 查 | 判断键存在 | key in dic / key not in dic |
判断key是否在字典中(仅判断键) | O(1) | 不判断值是否存在 |
| 进阶 | 字典复制(浅拷贝) | dic.copy() / dict(dic) / {** dic} |
复制外层键值对,嵌套容器为引用 | O(n) | 修改嵌套元素会影响原字典 |
| 进阶 | 字典复制(深拷贝) | copy.deepcopy(dic) |
完全复制所有层级,内外独立 | O(n) | 需导入import copy |
| 进阶 | 字典解包 | merged_dic = {** dic1, ** dic2} |
拼接两个字典,返回新字典 | O(n+k) | 键重复时后者覆盖前者 |
| 进阶 | 按键/值排序 | sorted(dic, key=lambda k: dic[k]) |
按键/值排序,返回排序后的键列表 | O(n log n) | 字典本身无序,仅返回排序后的键 |
| 其他 | 获取长度 | len(dic) |
返回键值对个数 | O(1) | 空字典返回0 |
| 其他 | 判断字典为空 | if not dic |
空字典返回True,非空返回False | O(1) | 简化写法,等价于len(dic) == 0 |
四、集合(set):无序可变、元素唯一不可变
| 操作类型 | 具体操作 | 语法示例 | 功能描述 | 时间复杂度 | 注意事项 |
|---|---|---|---|---|---|
| 增 | 添加单个元素 | s.add(x) |
添加元素x,已存在则忽略 | O(1) | 元素必须是不可变类型(数字/字符串/元组) |
| 增 | 批量添加元素 | s.update(iterable) |
批量添加可迭代对象的所有元素,自动去重 | O(k) | 字符串按字符拆分,支持多参数(如s.update(lst, tup)) |
| 增 | 集合推导式 | new_s = {x for x in 可迭代对象 if 条件} |
按规则生成新集合,自动去重 | O(n) | 过滤与去重同时完成 |
| 删 | 删除指定元素(报错) | s.remove(x) |
删除元素x,不存在则报错 | O(1) | x不存在报错KeyError |
| 删 | 删除指定元素(不报错) | s.discard(x) |
删除元素x,不存在则忽略 | O(1) | 推荐优先使用,避免报错 |
| 删 | 随机删除元素 | s.pop() |
随机删除并返回一个元素 | O(1) | 空集合调用报错KeyError |
| 删 | 清空集合 | s.clear() |
清空所有元素,保留集合对象 | O(n) | 结果为set(),集合仍可复用 |
| 改 | 修改元素(间接) | s.discard(旧值) + s.add(新值) |
先删除旧元素,再添加新元素 | O(1) | 无直接修改方法,需分两步 |
| 查 | 判断元素存在 | x in s / x not in s |
判断x是否在集合中 | O(1) | 效率远高于列表/元组 |
| 查 | 遍历元素 | for elem in s |
迭代所有元素(无序) | O(n) | 输出顺序与插入顺序无关 |
| 集合运算 | 交集(共同元素) | s1 & s2 / s1.intersection(s2) |
返回两个集合的共同元素,生成新集合 | O(min(n,k)) | 支持多个集合(如`s1 & s2 & |
