Skip to content

09|字典

字典是 Python 中最常用的映射类型。它存储键值对,通过键快速查找对应的值。处理配置、缓存、计数、分组等场景时,字典都是首选工具。

一、创建字典

python
# 字面量
person = {"name": "Alice", "age": 25, "city": "Beijing"}

# 空字典
empty = {}
empty = dict()

# 从键值对序列创建
pairs = [("a", 1), ("b", 2)]
d = dict(pairs)   # {'a': 1, 'b': 2}

# 用关键字参数创建(键必须是合法标识符)
d = dict(name="Alice", age=25)

二、增删改查

python
person = {"name": "Alice", "age": 25}

# 查询
person["name"]              # 'Alice'
person.get("gender")        # None,键不存在时返回 None
person.get("gender", "N/A") # 'N/A',指定默认值

# 增加和修改
person["age"] = 26          # 修改已有键
person["gender"] = "female" # 添加新键

# 删除
person.pop("age")           # 删除并返回值,键不存在抛 KeyError
person.pop("age", None)     # 键不存在时返回 None

del person["gender"]        # 删除键值对
person.clear()              # 清空字典

[] 访问和 .get() 的区别:

python
d = {"a": 1}
d["b"]       # KeyError: 'b'
d.get("b")   # None,不报错
d.get("b", 0)   # 0,指定默认值

不确定键是否存在时,用 get() 更安全。需要区分"键不存在"和"键存在但值是 None"时,用 in 判断:

python
if "b" in d:
    print(d["b"])
else:
    print("键不存在")

三、遍历

python
person = {"name": "Alice", "age": 25, "city": "Beijing"}

# 遍历键(默认)
for key in person:
    print(key)

# 遍历值
for value in person.values():
    print(value)

# 遍历键值对
for key, value in person.items():
    print(f"{key}: {value}")

字典的遍历顺序是插入顺序(Python 3.7+ 保证)。不要依赖字典按值排序——如果需要排序,先取出 items 再排序:

python
for key in sorted(person):
    print(key, person[key])

四、合并字典

python
a = {"x": 1, "y": 2}
b = {"y": 3, "z": 4}

# Python 3.9+
c = a | b     # {'x': 1, 'y': 3, 'z': 4},后面覆盖前面

# 旧版本
c = {**a, **b}   # 解包合并
a.update(b)       # 把 b 合并进 a,原地修改

键冲突时,后面的值覆盖前面的值。

五、字典推导式

python
names = ["Alice", "Bob", "Charlie"]
length_map = {name: len(name) for name in names}
# {'Alice': 5, 'Bob': 3, 'Charlie': 7}

# 带条件
long_names = {name: len(name) for name in names if len(name) > 3}
# {'Alice': 5, 'Charlie': 7}

六、对键的要求

字典的键必须是不可变类型(可哈希):

python
d = {}
d["key"] = 1        # 字符串可以
d[42] = 2           # 整数可以
d[(1, 2)] = 3       # 元组可以
d[[1, 2]] = 4       # TypeError: unhashable type: 'list'

用元组做键的场景:坐标点缓存、复合主键查询等。

七、setdefaultcollections.defaultdict

分组统计时,经常需要先判断键是否存在:

python
counts = {}
for item in items:
    if item not in counts:
        counts[item] = 0
    counts[item] += 1

setdefault 简化这个模式:

python
counts = {}
for item in items:
    counts.setdefault(item, 0)
    counts[item] += 1

setdefault(key, default):键存在时返回值,键不存在时设置默认值并返回。

更简洁的写法用 collections.defaultdict

python
from collections import defaultdict

counts = defaultdict(int)   # 默认值为 0(int() 的结果)
for item in items:
    counts[item] += 1       # 键不存在时自动创建并设默认值

defaultdict 和普通字典的唯一区别:访问不存在的键时,自动调用工厂函数生成默认值并插入。其他操作完全一致。

记忆锚点:字典按键查找,get() 不报错,[] 不存在抛 KeyError;遍历用 .items();合并用 |{**a, **b};键必须不可变;setdefaultdefaultdict 简化分组统计;字典保持插入顺序(Python 3.7+)。