第 07 课 · 入门 · 19 分钟

Python 字典

用有名字的键保存值,通过名称查找,而不是通过位置。

键访问get 默认值items 与计数

熟客说「老样子」,这句话对一排位置毫无意义,对一个名字却什么都说得清。字典能让「燕麦拿铁」直接换出价格,不用数到第几行。可名字不在菜单上时,该发生什么?

字典把键映射到值。当一条记录包含有名字的字段,例如饮品、价格和数量,就适合用字典。键必须唯一;给已有键重新赋值会覆盖旧值。 你还会安全地计数,并逐层读取嵌套记录。

按键查找

方括号可以按键读取值。缺少键会触发 KeyError。get(key, default) 会返回默认值而不是报错,适合处理可选字段和计数。

order = {"drink": "拿铁", "price": 4.5}
print(order["drink"])
print(order.get("quantity", 1))
print(order.get("notes", "无"))

键访问与默认值

遍历键值对

keys()、values() 和 items() 提供不同的视图。items() 会产生键值对,可以在 for 循环中解包。现代 Python 会保留插入顺序。

order = {"drink": "拿铁", "price": 4.5}
for key, value in order.items():
    print(key, value)

把记录变成循环

用 get 计数

要统计出现次数,先用 get(name, 0) 读取当前计数,加一,再赋回去。这个模式可以处理第一次出现的情况,不需要额外判断。

orders = ["拿铁", "茶", "拿铁"]
counts = {}
for drink in orders:
    counts[drink] = counts.get(drink, 0) + 1
print(counts)

统计重复值

计数时不触发 KeyError

某个键第一次出现时,counts[key] += 1 会失败;dict.get(key, 0) 提供默认值,又不会修改字典。标准库的 collections.Counter 更省事,但手写一次循环能把计数规则看清楚。

votes = ["tea", "latte", "tea", "mocha", "tea"]
counts = {}
for vote in votes:
    counts[vote] = counts.get(vote, 0) + 1
print(counts)
print(counts.get("water", 0))

默认值让计数更安全

逐层读取嵌套记录

嵌套字典方便,也脆弱:每一层都可能缺失。一次读一层,可选字段用 .get(),索引前检查类型。customer 缺失,和 customer 存在但没有 name,是两种不同情况。

order = {"id": 7, "customer": {"name": "Maya"}, "items": ["latte"]}
customer = order.get("customer", {})
print(customer.get("name", "unknown"))
print(order.get("note", "no note"))
items = order.get("items", [])
print(isinstance(items, list), len(items))

可选键与类型检查

用 get() 计数

dict.get(key, default) 读取不存在的键时不会抛 KeyError,因此很适合计数。counts[word] = counts.get(word, 0) + 1 是标准写法。要排名时,按值降序、键升序排序;lambda 返回一个元组,就能同时表达两条规则。

words = ["tea", "latte", "tea", "mocha", "tea"]
counts = {}
for word in words:
    counts[word] = counts.get(word, 0) + 1
print(counts)
print(sorted(counts.items(), key=lambda pair: (-pair[1], pair[0])))

先计数,再排名

本课要点

  • 字典使用有名字的键,而不是数字位置。
  • 键不存在时,get 会返回默认值。
  • items() 一次给出键和值。
  • 给已有键赋值会更新它的值。
  • dict.get() 可以给默认值;嵌套访问仍要逐层检查。
  • get(key, 0) 让计数不必先判断键是否存在。

常见错误

  • 用方括号访问不存在的键,触发 KeyError。
  • 忘记字典的键必须唯一。
  • 试图直接排序字典,而不是排序它的 items。
  • 对可选数据直接用 d[key],缺少键时抛异常。
  • 键还不存在时就写 counts[word] += 1。
轮到你

创建一个订单字典,添加 quantity 字段,并打印格式化后的总价。

动手试试

改改变量、先预测输出,再运行代码。第一次点击“运行代码”时会下载 Python 运行时,可能需要几秒钟。

浏览器内 Python本地运行 · 无需账号
首次运行会从 CDN 下载 Pyodide。修改后点击“运行代码”。

练习本课

12 道题,作答后立即看到解释。

查看 12 道题答案开始练习
← 列表函数 →