讲解

字典(dict)是键值对的集合,用花括号创建:user = {'name': '小明', 'age': 18}。键必须是不可变(可哈希)对象——字符串、数字、元组都行,列表不行;值可以是任何东西。访问值用方括号 d['name'],键不存在会抛 KeyError;不确定键是否存在时用 get 方法,d.get('email') 找不到返回 None,d.get('email', '未填写') 可以指定默认值。自 Python 3.7 起,字典保证按插入顺序遍历。

字典是动态的:d['city'] = '北京' 添加或覆盖,del d['age'] 删除,in 判断键是否存在(注意是键不是值)。批量更新用 d.update(other)。遍历有三种姿势:for key in d 遍历键、d.values() 遍历值、d.items() 遍历键值对——配合解包写成 for key, value in d.items(): 是最常用的形态。keys()、values()、items() 返回的是「视图」,会随字典变化实时更新。

两个字典合并,Python 3.9+ 用 | 运算符:{**a, **b} 的旧写法和 a | b 效果相同,后者更新为前者的键加上后者的覆盖。嵌套字典访问深层值时注意防御:data.get('user', {}).get('name')。还有两个实用方法:setdefault 在键不存在时写入默认值并返回(统计计数场景常见,虽然 collections.Counter 更专业);pop 按键删除并返回值。字典在 Python 内部无处不在——对象的属性、函数的 **kwargs 都是字典,值得练到滚瓜烂熟。

示例

user = {'name': '小明', 'age': 18}
print('取值:', user['name'])
print('get 缺失键:', user.get('email'), ',带默认值:', user.get('email', '未填写'))

# 增、改、删
user['city'] = '北京'
user['age'] = 19
del user['age']
print('修改后:', user)
print('键存在判断:', 'name' in user, ',email 呢:', 'email' in user)

# 遍历键值对
scores = {'语文': 80, '数学': 90, '英语': 85}
for subject, score in scores.items():
    print(f'{subject}: {score}')

# 插入顺序有保证
print('键的顺序:', list(scores.keys()))

# 合并:后者覆盖前者
defaults = {'theme': 'light', 'font_size': 14}
options = {'font_size': 18}
merged = defaults | options
print('合并配置:', merged)

# setdefault:分组统计的惯用招式
words = ['苹果', '香蕉', '苹果']
counts = {}
for w in words:
    counts[w] = counts.setdefault(w, 0) + 1
print('计数:', counts)

# 嵌套防御
data = {'user': {'name': '小红'}}
print('深层取值:', data.get('user', {}).get('profile', {}).get('bio', '无简介'))

# 字典推导快速造表
squares = {n: n * n for n in range(1, 6)}
print('平方表:', squares)

常见坑

  • 用方括号访问不确定存在的键:d[key] 抛 KeyError 是线上高频崩溃。不确定就 get,确定才用 []。
  • 用列表等可变对象当键:d[[1, 2]] = 'x' 抛 TypeError(unhashable type)。键必须不可变,复合键用元组。
  • 遍历时改字典:for k in d: del d[k] 抛 RuntimeError。要删就先收集 keys 列表再删,或用字典推导式重建。
  • get 的默认值是共享对象要小心:d.setdefault('items', []) 每次拿同一个列表是特性(正因如此才能分组),但自己给 get 传可变默认值又误以为是每次新建时会困惑——记住默认值对象只有一个。

小结

字典按键存取,[] 严格、get 宽容;items() 配合解包遍历;3.7+ 保序、3.9+ 用 | 合并;键必须可哈希。下一节看自动去重的集合。