跳到主要内容

使用 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 dFalse
get(key, default)d.get('Thomas')Noned.get('Thomas', -1)-1

删除 key

d.pop('Bob')   # 返回 75,并删除该键值对

dict 与 list 对比(记忆要点)

dictlist
查找/插入极快,不随规模变慢随元素增加变慢
内存占用多占用少
本质用空间换时间用时间换空间

重要约束: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 必须不可变;用 inget() 防 KeyError
set无重复 key 集合,无 value;支持 &| 等集合运算;元素须不可变
不可变对象str、int、tuple(元素也不可变)可作 dict key 和 set 元素;list 不可
可变 vs 不可变可变对象方法改自身;不可变对象方法返回新对象,自身不变

思考练习:将 (1, 2, 3)(1, [2, 3]) 分别放入 dict 或 set,观察并解释结果。(提示:后者含 list,不可哈希。)