Cheatsheet: Python
Last updated on April 1, 2026 am
本文整理了一些 Python 的常见语法及数据结构。
基础数据结构
List(列表)
-
创建:
1
2
3
4
5lst = [] # 空列表
lst = [1, 2, 3, 4, 5]
lst = list(range(5)) # [0, 1, 2, 3, 4]
lst = [0] * 5 # [0, 0, 0, 0, 0]
lst = [[0] * 3 for _ in range(2)] # [[0,0,0], [0,0,0]],正确创建二维列表 -
访问与切片:
1
2
3
4
5
6
7
8
9lst = [1, 2, 3, 4, 5]
lst[0] # 1,首元素
lst[-1] # 5,末元素
lst[1:3] # [2, 3],切片 [start:end),左闭右开
lst[1:] # [2, 3, 4, 5]
lst[:3] # [1, 2, 3]
lst[::2] # [1, 3, 5],步长为 2
lst[::-1] # [5, 4, 3, 2, 1],反转 -
常用操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27# 添加
lst.append(x) # 尾部添加 $O(1)$
lst.extend([6, 7]) # 追加多个元素 $O(k)$
lst.insert(0, x) # 在位置 0 插入 $O(n)$
# 删除
lst.pop() # 删除并返回末尾元素 $O(1)$
lst.pop(0) # 删除并返回首元素 $O(n)$
lst.remove(x) # 删除第一个值为 x 的元素 $O(n)$
del lst[0] # 删除索引 0 的元素
del lst[1:3] # 删除切片
lst.clear() # 清空
# 查找
lst.index(x) # x 第一次出现的索引,找不到抛异常 $O(n)$
lst.count(x) # x 出现的次数 $O(n)$
x in lst # 是否存在 $O(n)$
# 其他
len(lst) # 长度 $O(1)$
lst.sort() # 原地排序 $O(n \log n)$
lst.sort(reverse=True) # 降序排序
lst.sort(key=lambda x: -x) # 自定义排序键
sorted(lst) # 返回新排序列表,原列表不变
lst.reverse() # 原地反转 $O(n)$
reversed(lst) # 返回反转迭代器
min(lst), max(lst), sum(lst) -
列表推导式:
1
2
3
4
5
6
7
8
9
10
11
12
13# 基本形式
squares = [x**2 for x in range(10)] # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 带条件
evens = [x for x in range(10) if x % 2 == 0] # [0, 2, 4, 6, 8]
# 多重循环
pairs = [(x, y) for x in range(3) for y in range(3)]
# 二维列表初始化(⚠️ 重要)
# 错误方式:[[0]*3]*3 会创建引用相同的子列表
# 正确方式:
matrix = [[0 for _ in range(3)] for _ in range(3)] -
复杂度速查:
操作 复杂度 说明 索引访问 lst[i]尾部添加 amortized append尾部删除 pop()头部插入/删除 insert(0),pop(0)查找 index,in排序 sort
Dict(字典)
-
创建:
1
2
3
4
5
6d = {} # 空字典
d = dict() # 空字典
d = {'a': 1, 'b': 2}
d = dict(a=1, b=2)
d = dict([('a', 1), ('b', 2)])
d = {x: x**2 for x in range(5)} # 字典推导式 {0:0, 1:1, 2:4, 3:9, 4:16} -
访问与修改:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18d = {'a': 1, 'b': 2, 'c': 3}
# 访问
d['a'] # 1,不存在则抛 KeyError
d.get('a') # 1,不存在返回 None
d.get('a', 0) # 1,不存在返回默认值 0
# 添加/修改
d['d'] = 4 # 添加或修改
d.update({'e': 5, 'f': 6}) # 批量更新
d.setdefault('g', 7) # key 不存在则设置,返回 value
# 删除
del d['a'] # 删除,不存在抛 KeyError
x = d.pop('b') # 删除并返回值,不存在抛 KeyError
x = d.pop('b', None) # 删除,不存在返回默认值
item = d.popitem() # 删除并返回 (key, value) 对,LIFO 顺序(Python 3.7+)
d.clear() # 清空 -
遍历:
1
2
3
4
5
6
7
8
9
10
11
12
13d = {'a': 1, 'b': 2, 'c': 3}
for key in d: # 遍历 key
print(key)
for key in d.keys(): # 同上
print(key)
for value in d.values(): # 遍历 value
print(value)
for key, value in d.items(): # 遍历 (key, value)
print(key, value) -
常用操作:
1
2
3
4
5
6
7len(d) # 键值对数量 $O(1)$
'a' in d # 判断 key 是否存在 $O(1)$
1 in d.values() # 判断 value 是否存在 $O(n)$
# 合并字典(Python 3.9+)
d3 = d1 | d2 # 合并为新字典
d1 |= d2 # d1 更新为合并结果 -
OrderedDict(Python 3.7+ 普通 dict 也是有序的):
1
2
3
4
5from collections import OrderedDict
od = OrderedDict() # 有序字典
od.move_to_end('key') # 移到末尾
od.move_to_end('key', last=False) # 移到开头 -
复杂度速查:
操作 平均 最坏 访问/插入/删除 查找 key 遍历
Tuple(元组)
-
特点:不可变序列,可作为 dict 的 key
-
创建与使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18t = () # 空元组
t = (1,) # 单元素元组,逗号必须!
t = (1, 2, 3)
t = 1, 2, 3 # 括号可省略
# 不可变
# t[0] = 100 # TypeError
# 解包
a, b, c = (1, 2, 3)
a, b = b, a # 交换变量
first, *rest = (1, 2, 3, 4) # first=1, rest=[2,3,4]
# 命名元组
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print(p.x, p.y) # 1 2
Set(集合)
-
特点:无序、不重复元素集合
-
创建:
1
2
3
4s = set() # 空集合,不能用 {}(那是空字典)
s = {1, 2, 3}
s = set([1, 2, 2, 3]) # {1, 2, 3},自动去重
s = {x for x in range(10) if x % 2 == 0} # 集合推导式 -
操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29# 添加/删除
s.add(4) # 添加元素 $O(1)$
s.remove(4) # 删除,不存在抛 KeyError
s.discard(4) # 删除,不存在不报错
x = s.pop() # 随机删除并返回一个元素
s.clear() # 清空
# 集合运算(面试高频!)
a = {1, 2, 3}
b = {2, 3, 4}
a | b # 并集 {1, 2, 3, 4}
a & b # 交集 {2, 3}
a - b # 差集 {1}
a ^ b # 对称差集 {1, 4}
a.union(b) # 并集,返回新集合
a.intersection(b) # 交集
a.difference(b) # 差集
a.symmetric_difference(b) # 对称差集
a.update(b) # a 更新为并集(原地修改)
a.intersection_update(b) # a 更新为交集
# 判断
1 in s # 是否存在 $O(1)$
a.issubset(b) # a 是否是 b 的子集
a.issuperset(b) # a 是否是 b 的超集
a.isdisjoint(b) # 是否不相交 -
应用场景:
1
2
3
4
5
6
7
8# 去重
unique = list(set(lst))
# 判断重复
has_duplicate = len(lst) != len(set(lst))
# 找两列表共同元素
common = list(set(lst1) & set(lst2)) -
复杂度速查:
操作 平均 最坏 添加 删除 查找 并/交/差集 -
Frozen Set(不可变集合)
1 | |
进阶数据结构(collections 模块)
deque(双端队列)
- 特点:两端 插入删除,适合队列/栈场景
1 | |
- vs list:
deque两端操作 ,list头部操作deque随机访问 ,list是- 队列/栈场景优先用
deque
Counter(计数器)
1 | |
defaultdict(默认字典)
1 | |
namedtuple(命名元组)
1 | |
优先队列(堆)
Python 使用 heapq 模块实现最小堆。
heapq 基础(最小堆)
Python 的 heapq 模块实现的是最小堆(堆顶元素最小),用一个普通列表来存储堆结构。
核心概念
- 堆:特殊的完全二叉树,父节点 ≤ 子节点(最小堆)
- 堆顶:列表的第 0 个元素
h[0],总是当前最小值 - 列表存储:堆用列表模拟二叉树,对于索引
i:- 左子节点索引 =
2*i + 1 - 右子节点索引 =
2*i + 2 - 父节点索引 =
(i-1) // 2
- 左子节点索引 =
完整使用流程
1 | |
常用操作速查
| 操作 | 函数 | 说明 | 复杂度 |
|---|---|---|---|
| 入堆 | heapq.heappush(h, x) |
添加元素 x,自动调整堆 |
|
| 出堆 | heapq.heappop(h) |
弹出并返回最小值 | |
| 查看堆顶 | h[0] |
不移除,仅查看最小值 | |
| 列表转堆 | heapq.heapify(lst) |
原地转换已有列表 |
组合操作(效率优化)
1 | |
最大堆实现(Python 技巧)
heapq 只提供最小堆,实现最大堆需要技巧:
方法 1:存入负值(最常用)
1 | |
方法 2:封装成类(更清晰)
1 | |
高级用法
1 | |
带优先级的元素
1 | |
其他常用技巧
字符串操作
1 | |
列表/字典常用技巧
1 | |
面试高频模式
1 | |
Cheatsheet: Python
https://cny123222.github.io/2026/03/31/Cheatsheet-Python/