Python 编程 - 字典(dict)
Python 3 中的 dict(字典)是一种无序(严格说是 Python 3.7+ 插入有序)、可变、键值对(Key-Value)的映射容器类型。它是 Python 最核心、最强大的数据结构之一,底层基于哈希表实现,平均时间复杂度为 O(1)。
以下是 Python 3 中 dict 的全面解析,重点标注了 Python 3 独有的新特性:
1. 核心特性(Python 3.7+ 正式确定)
- 保持插入顺序:在 Python 3.7 及以后,
dict正式保证会记住键值对的插入顺序(在此之前 3.6 仅为 CPython 实现细节)。遍历字典时,顺序与插入时一致。 - 键必须可哈希(Hashable):键必须是不可变类型(如
int、str、tuple),因为需要计算哈希值。list、set或dict本身不能作为键。 - 值可以是任意类型:值可以是任何 Python 对象,包括可变对象。
2. 创建字典
# 方式一:花括号
d1 = {'name': 'Alice', 'age': 30}
# 方式二:dict() 构造函数(键名不加引号)
d2 = dict(name='Bob', age=25)
# 方式三:键值对列表(适用于动态构建)
d3 = dict([('a', 1), ('b', 2)])
# 方式四:字典推导式(Python 3 特色)
squares = {x: x**2 for x in range(5)} # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 方式五:fromkeys 创建默认值字典
d4 = dict.fromkeys(['x', 'y'], 0) # {'x': 0, 'y': 0}
3. 常用增删改查操作
| 操作 | 代码示例 | 说明 |
|---|---|---|
| 增加/修改 | d['key'] = 'value' |
键存在则覆盖,不存在则新增 |
| 安全取值 | d.get('key', '默认值') |
键不存在返回 None 或指定默认值,不抛异常 |
| 强制取值 | d['missing'] |
键不存在会抛出 KeyError |
| 设置默认 | d.setdefault('x', []) |
若键存在返回值,若不存在则插入该键并返回默认值 |
| 删除 | del d['key'] |
删除键值对(不存在抛 KeyError) |
| 安全弹出 | value = d.pop('key', None) |
删除并返回值,若不存在返回默认值不抛异常 |
| 弹出末尾项 | d.popitem() |
删除并返回最后插入的键值对(LIFO 后进先出) |
| 合并更新 | d.update({'a': 1}) |
合并另一个字典或可迭代对象到当前字典 |
4. Python 3.9+ 新特性:合并与更新运算符
Python 3.9 引入了更优雅的字典合并语法:
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
# 合并(生成新字典):b 的值被 dict2 覆盖
merged = dict1 | dict2 # {'a': 1, 'b': 3, 'c': 4}
# 原地更新(修改 dict1)
dict1 |= dict2 # dict1 现在变为 {'a': 1, 'b': 3, 'c': 4}
5. 遍历方式(性能高效)
d = {'name': 'Tom', 'age': 18}
# 遍历键(默认)
for key in d:
print(key)
# 遍历值
for value in d.values():
print(value)
# 遍历键值对(推荐,解包)
for key, value in d.items():
print(key, value)
6. Python 3 独有的视图(View)对象
d.keys()、d.values()、d.items() 返回的是视图,而非复制列表。视图会动态反映字典的修改,且支持集合运算(针对 keys 和 items):
keys = d.keys()
d['new'] = 100
print(keys) # 视图自动包含了 'new'
# 集合操作(取交集)
d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'c': 4}
print(d1.keys() & d2.keys()) # {'b'}
7. 内存优化(对比 Python 2)
Python 3.6+ 重新设计了字典底层结构(称为 Compact Dict),使得字典在内存占用上比 Python 2 减少了约 20% 到 25%,且迭代速度更快。
8. 高性能与注意事项
- 时间复杂度:查找、插入、删除平均为 O(1),但最坏情况(哈希冲突严重)为 O(n)。
- 排序:虽然保持插入顺序,但若需按键或值排序,可用
sorted(d.items())构建新字典。 - 比较:Python 3 中,字典之间不能使用
<>比较大小,但支持==和!=(无视顺序,仅比较内容)。
9. 搭配 collections 模块更强大
虽然属于标准库,但在实际开发中常与 dict 配合:
defaultdict:当键不存在时,自动调用工厂函数生成默认值(避免setdefault)。from collections import defaultdict dd = defaultdict(list) dd['a'].append(1) # 无需判断键是否存在OrderedDict:虽然普通 dict 已有序,但OrderedDict额外提供了move_to_end等重排序方法,在 Python 3 中仍有其特定用途。
总结一句话:Python 3 的 dict 是集有序性、高性能哈希查找和内存紧凑于一身的全能键值对容器,配合 3.9 的 | 运算符和 3.7+ 的有序特性,彻底让它成为了开发者首选的无脑映射工具。

浙公网安备 33010602011771号