字典与集合常用 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修改原字典,|创建新字典。
课后小问
什么时候用
user.get("age")而不是user["age"]? 答案:键是可选的、缺失时有合理默认值时。 解析:[]会在缺失时抛KeyError,能帮助发现必需数据缺失;可选数据则使用get。如何求两个标签集合的共同部分? 答案:使用
a & b或a.intersection(b)。 解析:集合交集只保留同时属于两边的元素,结果仍是集合。
本节小结
字典解决“键找值”,集合解决“去重与关系”;get、items、update 和 & | - 是最值得熟练的速查入口。
快速回顾
- 字典安全取值:
get - 字典遍历:
items - 字典合并:
|、update - 集合关系:
&、|、-、^ - 可哈希:可作为字典键或集合元素
阿源的知识库