使用 dict 和 set
1. dict(字典)
基本概念
- 定义:键-值(key-value)存储结构,在其他语言中常称为 map
- 特点:查找速度极快,不随 key 数量增加而变慢
- 原理:类似查字典——根据 key 用哈希算法算出 value 的存放位置,直接取值
创建与访问
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
d['Michael'] # 95
# 通过 key 放入
d['Adam'] = 67
d['Adam'] # 67
注意:同一 key 多次赋值,后面的会覆盖前面的。
避免 KeyError 的两种方式
| 方式 | 示例 |
|---|---|
in 判断 | 'Thomas' in d → False |
get(key, default) | d.get('Thomas') → None;d.get('Thomas', -1) → -1 |
删除 key
d.pop('Bob') # 返回 75,并删除该键值对
dict 与 list 对比(记忆要点)
| dict | list | |
|---|---|---|
| 查找/插入 | 极快,不随规模变慢 | 随元素增加变慢 |
| 内存 | 占用多 | 占用少 |
| 本质 | 用空间换时间 | 用时间换空间 |
重要约束:key 必须是不可变对象
- dict 根据 key 计算存储位置,key 若可变则哈希结果会变,内部会混乱
- 可作 key:str、int、tuple(若元素也不可变)
- 不可作 key:list(可变)
# 错误示例
key = [1, 2, 3]
d[key] = 'a list' # TypeError: unhashable type: 'list'
2. set(集合)
基本概念
- 定义:一组 key 的集合,不存储 value;key 不重复
- 特点:无序、无重复,可做数学上的交集、并集
创建
s = {1, 2, 3}
# 或从 list 创建
s = set([1, 2, 3])
重复元素会被自动过滤:{1, 1, 2, 2, 3} → {1, 2, 3}
常用操作
s.add(4) # 添加元素,重复添加无效
s.remove(4) # 删除元素
集合运算
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s1 & s2 # 交集 {2, 3}
s1 | s2 # 并集 {1, 2, 3, 4}
约束
与 dict 相同:不可放入可变对象(无法保证“无重复”),list 不能放入 set。
3. 再议不可变对象
可变对象(如 list)
- 调用方法会直接修改对象自身
a = ['c', 'b', 'a']
a.sort()
a # ['a', 'b', 'c'],a 被改变
不可变对象(如 str)
- 调用方法不改变原对象,而是返回新对象
- 变量
a指向对象'abc';a.replace('a', 'A')作用在'abc'上,得到新字符串'Abc'并返回,a仍指向'abc'
a = 'abc'
b = a.replace('a', 'A')
b # 'Abc'
a # 'abc'(不变)
记忆:不可变对象调用任意方法都不会改变自身,只会创建新对象并返回。
小结
| 要点 | 说明 |
|---|---|
| dict | 键值存储,查找快;key 必须不可变;用 in 或 get() 防 KeyError |
| set | 无重复 key 集合,无 value;支持 &、| 等集合运算;元素须不可变 |
| 不可变对象 | str、int、tuple(元素也不可变)可作 dict key 和 set 元素;list 不可 |
| 可变 vs 不可变 | 可变对象方法改自身;不可变对象方法返回新对象,自身不变 |
思考练习:将 (1, 2, 3) 和 (1, [2, 3]) 分别放入 dict 或 set,观察并解释结果。(提示:后者含 list,不可哈希。)