特性(基于Python 3.4 流畅的Python 部分可能不适用最新版本) 键必须可散列 字典和集合实现的背后是散列。散列最小单元是表元。 内存开销巨大 相比列表将占用大量内存。典型的用空间
特性(基于Python 3.4 流畅的Python 部分可能不适用最新版本)
键必须可散列
字典和集合实现的背后是散列。散列最小单元是表元。
内存开销巨大
相比列表将占用大量内存。典型的用空间换时间。在定义数据类型时,尽可能采用__slots__ 属性可以改变实例属性的存储 方式, 由 dict 变成 tuple
键查询速度极快
基于散列特性字典和集合对in进行了优化。in查询效率非常高
将迭代和更新尽可能分开
无论何时往字典里添加新的键, Python 解释器都可能做出为字典扩容的决定。 扩容导致的结果就是要新建一个更大的散列表, 并把字典里已有的元素添加到新表里。 这个过程中可能会发生新的散列冲突, 导致新散列表中键的次序变化。 要注意的是, 上面提到的这些变化是否会发生以及如何发生, 都依赖于字典背后的具体实现, 因此你不能很自信地说自己知道背后发生了什么。 如果你在迭代一个字典的所有键的过程中同时对字典进行修改, 那么这个循环很有可能会跳过一些键——甚至是跳过那些字典中已经有的键。由此可知, 不要对字典同时进行迭代和修改。 如果想扫描并修改一个字典, 最好分成两步来进行: 首先对字典迭代, 以得出需要添加的内容, 把这些内容放在一个新字典里; 迭代结束之后再对原有字典进行更新
dict 找不到键选择
字典嵌套案例
defaultdict
import collections import random data = collections.defaultdict(list) v = [random.randint(1, 3) for _ in range(10)] for item in range(5): data[item].append(item)setdefault
import random data = {} v = [random.randint(1, 3) for _ in range(10)] for item in range(5): data.setdefault(item, []).append(item)pop
删除一个指定键值对
d = {} d.pop(key, default) # 指定默认值,键不存在时返回默认值。类似 getreversed
返回倒序键的迭代器