dict(字典)是 Python 中最核心也最常用的数据结构之一。它是一种键值对(key-value)映射,允许你通过唯一的键来快速查找、插入和删除对应的值。
为什么需要字典?
假设你要存储一个学生的信息:姓名、年龄、成绩。用列表的话,你需要记住索引0是姓名、1是年龄、2是成绩,代码可读性差且容易出错。用字典则可以用有意义的字符串作为“键”,让代码自解释:
student = {"name": "小明", "age": 20, "score": 88}
print(student["name"]) # 小明
创建字典
- 花括号字面量:
d = {"a": 1, "b": 2} dict()构造函数:- 传入关键字参数:
d = dict(name="小明", age=20) - 传入键值对序列:
d = dict([("a", 1), ("b", 2)]) - 字典推导式:
d = {x: x**2 for x in range(3)}→{0:0, 1:1, 2:4}
注意:从 Python 3.7 开始,字典正式保证插入顺序,即迭代时的顺序与键插入的顺序一致。
基本操作
- 访问元素:
d[key],若 key 不存在会抛出KeyError。更安全的方式是用d.get(key, default),不存在时返回默认值(不报错)。 - 添加/修改:
d[key] = value,如果 key 已存在则更新,不存在则新增。 - 删除元素:
del d[key]:删除指定键,不存在则报错。d.pop(key, default):删除并返回值,不存在可返回默认值。d.popitem():删除并返回最后插入的键值对(Python 3.7+ 保证 LIFO)。- 检查键是否存在:
key in d,返回布尔值。 - 长度:
len(d)返回键值对数量。
常用方法
| 方法 | 说明 |
|------|------|
| d.keys() | 返回所有键的视图(可迭代) |
| d.values() | 返回所有值的视图 |
| d.items() | 返回键值对视图,常用于遍历 for k, v in d.items() |
| d.update(other) | 将另一个字典或键值对的键值更新到 d 中,相同键会被覆盖 |
| d.setdefault(key, default) | 若 key 不存在则设置默认值并返回该值;存在则返回已有值 |
| d.clear() | 清空字典 |
字典推导式
一种快速生成字典的简洁语法:
# 将列表元素映射为其平方
sq = {x: x*x for x in range(5)} # {0:0, 1:1, 2:4, 3:9, 4:16}
# 从两个列表构建映射
keys = ['a','b','c']
vals = [1,2,3]
d = {k:v for k,v in zip(keys, vals)} # {'a':1, 'b':2, 'c':3}
键的要求:必须是可哈希的
字典通过哈希表实现,所以键必须满足不可变且可哈希。常见的可用作键的类型有:字符串、数字、元组(但元组中包含不可哈希元素也不行)。不能用列表、字典、集合等可变类型作为键。
# 合法
{(1,2): "point"} # 元组可哈希
# 非法
{[1,2]: "point"} # TypeError: unhashable type: 'list'
字典的底层实现与性能
- CPython 使用开放寻址哈希表存储字典,使得平均查找、插入、删除的时间复杂度都是 O(1)。
- 字典在内存上会有一定开销,但对于一般应用完全可以接受。
- 当字典元素数量达到一定阈值时,会自动扩容(类似列表的扩容机制),但发生的频率较低。
常见使用场景与模式
- 缓存 / 计数器:用字典统计字符频率:
s = "abracadabra"
freq = {}
for ch in s:
freq[ch] = freq.get(ch, 0) + 1
或直接用 collections.Counter。
- 替代多分支 if-elif:用字典映射条件对应的处理函数,减少重复代码。
- 稀疏矩阵:用字典存储非零元素的位置和值。
- JSON 数据表示:Python 字典与 JSON 对象结构一致,序列化/反序列化非常方便。
注意事项
- 字典大小写敏感:
"Name"和"name"是不同的键。 - 键重复:创建时如果出现重复的键,后面的值会覆盖前面的。
- 遍历中修改:不要在遍历字典时直接增删元素,否则会引发
RuntimeError。可以遍历list(d.keys())的副本,或者将需删除的键先收集后删除。 - 视图对象:
keys(),values(),items()返回的是动态视图,会随字典变化而变化(但不是列表,需要显式用list()拷贝)。
字典作为 Python 的内置映射类型,是构建复杂程序的基石,掌握好它会让你的代码简洁、高效、易维护。