Appearance
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'用元组做键的场景:坐标点缓存、复合主键查询等。
七、setdefault 和 collections.defaultdict
分组统计时,经常需要先判断键是否存在:
python
counts = {}
for item in items:
if item not in counts:
counts[item] = 0
counts[item] += 1setdefault 简化这个模式:
python
counts = {}
for item in items:
counts.setdefault(item, 0)
counts[item] += 1setdefault(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};键必须不可变;setdefault 和 defaultdict 简化分组统计;字典保持插入顺序(Python 3.7+)。