Python dict 高阶特性

时间:2022-12-13 18:53:48

特性(基于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)
# 指定默认值,键不存在时返回默认值。类似 get

reversed

返回倒序键的迭代器