Skip to content

字典与集合常用 API ​

学习目标 ​

  • 用字典表达键值映射,用集合表达去重和集合关系。
  • 掌握安全取值、合并、遍历、集合运算。
  • 理解键的可哈希要求和视图对象。

核心知识点 ​

字典按键映射值,Python 3.7+ 保证遍历顺序为插入顺序;集合只保存唯一的可哈希元素。字典的 keys()、values()、items() 返回动态视图,集合运算通常比手写嵌套循环更清晰。

常用用法 ​

创建与取值 ​

python
user = {"name": "Ada", "score": 98}
name = user["name"]
missing = user.get("age", 0)
print(name, missing)
# 输出:Ada 0

已确定键存在可用 [];可选键用 get,避免 KeyError。

dict.get() 与默认值 ​

python
counts = {"ok": 2}
counts["error"] = counts.get("error", 0) + 1
print(counts)
# 输出:{'ok': 2, 'error': 1}

默认值表达式会在调用时求值;复杂初始化可考虑 defaultdict。

dict.update() 与合并 ​

python
base = {"host": "localhost", "port": 8000}
override = {"port": 9000}
merged = base | override
base.update(override)
print(merged, base)
# 输出:{'host': 'localhost', 'port': 9000} {'host': 'localhost', 'port': 9000}

| 返回新字典,|= 和 update 修改左侧对象;重复键由右侧值覆盖。

遍历 items() ​

python
scores = {"Ada": 98, "Lin": 91}
summary = [f"{name}:{score}" for name, score in scores.items()]
print(summary)
# 输出:['Ada:98', 'Lin:91']

遍历字典默认遍历键;需要键和值时明确写 items()。

set 去重与成员判断 ​

python
tags = set(["python", "data", "python"])
print(sorted(tags), "python" in tags)
# 输出:['data', 'python'] True

集合无序,不要依赖集合打印顺序;需要稳定展示时排序。

集合关系运算 ​

python
frontend = {"html", "css", "js"}
backend = {"python", "sql", "js"}
print(sorted(frontend & backend), sorted(frontend - backend), sorted(frontend | backend))
# 输出:['js'] ['css', 'html'] ['css', 'html', 'js', 'python', 'sql']

& 交集、- 差集、| 并集、^ 对称差集;集合元素必须可哈希。

set.add() 与 set.discard() ​

python
values = {1, 2}
values.add(3)
values.discard(9)
print(sorted(values))
# 输出:[1, 2, 3]

discard 删除不存在的元素不报错;remove 不存在时会抛 KeyError。

不常用但需要知道 ​

dict.setdefault() ​

python
groups = {}
groups.setdefault("python", []).append("list")
print(groups)
# 输出:{'python': ['list']}

它适合简单分组;大量分组时 collections.defaultdict(list) 通常更直观。

collections.defaultdict ​

python
from collections import defaultdict

groups = defaultdict(list)
groups["python"].append("dict")
print(dict(groups))
# 输出:{'python': ['dict']}

访问缺失键会自动创建默认值,读取配置时要注意这一副作用。

frozenset ​

python
permissions = frozenset({"read", "write"})
mapping = {permissions: "editor"}
print(mapping[permissions])
# 输出:editor

不可变集合可作为字典键或其他集合的元素。

易混点 ​

  • 字典的键必须可哈希,列表不能作为键,元组在元素都可哈希时可以作为键。
  • dict.get(k, default) 不会写回默认值。
  • set 没有可靠索引,也不保证打印顺序。
  • 遍历字典时修改键集合可能触发 RuntimeError,先复制键或构造新字典。
  • update 修改原字典,| 创建新字典。

课后小问 ​

  1. 什么时候用 user.get("age") 而不是 user["age"]? 答案:键是可选的、缺失时有合理默认值时。 解析:[] 会在缺失时抛 KeyError,能帮助发现必需数据缺失;可选数据则使用 get。

  2. 如何求两个标签集合的共同部分? 答案:使用 a & b 或 a.intersection(b)。 解析:集合交集只保留同时属于两边的元素,结果仍是集合。

本节小结 ​

字典解决“键找值”,集合解决“去重与关系”;get、items、update 和 & | - 是最值得熟练的速查入口。

快速回顾 ​

  • 字典安全取值:get
  • 字典遍历:items
  • 字典合并:|、update
  • 集合关系:&、|、-、^
  • 可哈希:可作为字典键或集合元素