熟客说「老样子」,这句话对一排位置毫无意义,对一个名字却什么都说得清。字典能让「燕麦拿铁」直接换出价格,不用数到第几行。可名字不在菜单上时,该发生什么?
字典把键映射到值。当一条记录包含有名字的字段,例如饮品、价格和数量,就适合用字典。键必须唯一;给已有键重新赋值会覆盖旧值。 你还会安全地计数,并逐层读取嵌套记录。
按键查找
方括号可以按键读取值。缺少键会触发 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 运行时,可能需要几秒钟。
练习本课
12 道题,作答后立即看到解释。