人人都会AI编程

映射类型:dict

更新时间:2026-07-12

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 的内置映射类型,是构建复杂程序的基石,掌握好它会让你的代码简洁、高效、易维护。