字典(dict)在 Python 中实现键到值的映射:通过键访问对应值,而不必像列表那样依赖整数下标。键须唯一且可哈希,值可为任意类型。本节说明创建方式、增删改查、遍历与嵌套结构。配置数据、JSON 解析结果与按名称检索等场景常用字典。
键到值的映射
字面量使用花括号,项之间以 键: 值 表示。同一键重复赋值时,后写入的值覆盖先前的。查找使用 person["name"] 等形式,依据的是键而非插入顺序:
person = {"name": "小明", "age": 20, "city": "北京"}
print(person["name"]) # 小明
print(person["age"]) # 20
几种创建方式
空字典可写作 {} 或 dict()。除字面量外,可将关键字实参传给 dict,或传入 (键, 值) 序列。关键字形式要求键为合法标识符,复杂键宜使用字面量或键值对列表:
a = {}
b = {"apple": 5, "banana": 3}
c = dict(name="Tom", age=18)
d = dict([("a", 1), ("b", 2)])
print(b, c, d)
print(type(a)) # <class 'dict'>增删改查
方括号赋值时,键不存在则新增,已存在则覆盖。若键不存在,d["x"] 将抛出 KeyError。不确定键是否存在时,应使用 get,可指定缺省返回值。pop 删除指定键并返回其值,第二个参数可在键缺失时作为退路:
d = {"a": 1, "b": 2}
d["c"] = 3
d["a"] = 100
print(d) # {'a': 100, 'b': 2, 'c': 3}
print(d["a"]) # 100
# print(d["x"]) # KeyError
print(d.get("x")) # None
print(d.get("x", "缺省"))
d.pop("b")
print(d) # {'a': 100, 'c': 3}
print(d.pop("zzz", "没有"))
遍历字典
for k in d 默认遍历键。仅遍历值时使用 values(),同时处理键与值时使用 items() 并在循环中解包:
d = {"name": "Tom", "age": 18}
for k in d:
print(k, end=" ") # name age
print()
for v in d.values():
print(v, end=" ") # Tom 18
print()
for k, v in d.items():
print(f"{k}={v}", end=" ") # name=Tom age=18
print()自 Python 3.7 起,字典保留插入顺序,遍历结果通常与写入顺序一致,但定位数据仍应通过键而非假想下标。
键的判断与排序
in 检测的是键是否存在。若输出时须按键名排序,可对键调用 sorted 再取值:
d = {"banana": 3, "apple": 5, "cherry": 1}
print("apple" in d) # True
print("banana" in d.keys()) # True
for k in sorted(d):
print(k, d[k], end=" | ") # apple 5 | banana 3 | cherry 1
print()嵌套字典
值可以是字典或列表,从而表示分层结构。访问时由外向内使用键,遇到列表再使用下标。向尚未存在的内层写入前,须先创建中间层,否则将触发 KeyError:
school = {
"class1": {"人数": 30, "班主任": "张老师"},
"class2": {"人数": 28, "班主任": "李老师"},
}
print(school["class1"]["班主任"]) # 张老师
menu = {"soup": ["番茄汤", "酸辣汤"], "main": ["米饭", "面条"]}
print(menu["main"][1]) # 面条可先执行 d["new"] = {} 再写入内层,或使用 setdefault(见下一篇字典方法)预先创建缺省容器。
注意事项
- 键缺失时方括号读取抛出
KeyError,不确定键是否存在时应使用get。 - 键须可哈希,列表不能作为键,元组可以。
- 同一键多次赋值时,保留最后一次写入的值。
- 嵌套写入前须确认中间层已存在。
本节说明了 Python 字典的映射模型与基本操作。下一篇介绍字典方法:get、update、setdefault 与视图对象等。