字典(dict)在 Python 中实现键到值的映射:通过键访问对应值,而不必像列表那样依赖整数下标。键须唯一且可哈希,值可为任意类型。本节说明创建方式、增删改查、遍历与嵌套结构。配置数据、JSON 解析结果与按名称检索等场景常用字典。

键到值的映射

字面量使用花括号,项之间以 键: 值 表示。同一键重复赋值时,后写入的值覆盖先前的。查找使用 person["name"] 等形式,依据的是键而非插入顺序:

键 key(唯一) 值 value "name" 小明 "age" 20 "city" 北京
字典不靠顺序找,靠键找值: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 删除指定键并返回其值,第二个参数可在键缺失时作为退路:

Python 字典增改查与删除示例运行
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 与视图对象等。