【python】 字典 dict、defaultdict、OrderDict 的对比

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

defaultdict

位于 collections 模块内。

在实例化一个 defaultdict 的时候,需要给构造方法提供一个可调用对象,这个可调用对象会在 __getitem__ 碰到找不到的键的时候被调用,让 __getitem__ 返回某种默认值。这个用来生成默认值的可调用对象存放在名为 default_factory 的实例属性里。

举个栗子

d = collections.defaultdict(list)		# 一个空字典

d['key']	# []
d.get('key')	# None
复制代码

OrderedDict

位于 collections 模块内。

这个类型在添加键的时候会保持顺序,因此键的迭代次序总是一致的。

OrderedDictpopitem 方法默认删除并返回的是字典里的最后一个元素,但是如果像 my_odict.popitem(last=False) 这样调用它,那么它删除并返回第一个被添加进去的元素。

字典们的抽象基类

collections.abc 模块中有 MappingMutableMapping 这两个抽象基类,它们的作用是为 dict 和其他类似的类型定义形式接口。

表中斜体为抽象方法/类。

类名 方法/属性 父类
Container __contains__ -
Iterable __iter__ -
Sized __len__ -
Mapping __getitem__ , __contains__ , __eq__ , __ne__ , get , items , keys, values Container , Iterable , Sized
MutableMappint __setitem__ , __delitem__ , clear , pop , popitem , setdefault , update Mapping

dictdefaultdictOrderDict 方法对比

[] 中为可选参数。

方法/对象 dict defaultdict OrderDict 说明
d.clear() 移除所有元素
d.__contains__(k) 检查 k 是否包含在 d
d.copy() 潜复制
d.__copy__() 用于支持 copy.copy
d.default_factory __missing__ 函数中被调用的函数, 用以给未找到的元素设置值
d.__missing__(k) __getitem__ 方法找不到对应键时,调用该方法
d.__delitem__(k) 移除键为 k 的元素
d.fromkeys(it, [initial]) 将迭代器 it 里的元素设置为映射里的键,如果有 initial 参数, 就把它作为这些键对应的值(默认是 None
d.get(k, [default]) 返回键 k 对应的值,没有 k 时返回 defaultNone
d.__getitem__(k) 使字典能用 d[k] 的形式返回键 k 对应的值
d.items() 返回所有键值对
d.__iter__() 获取键的迭代器
d.keys() 返回所有键
d.__len__() 可以用 len(d) 形式得到字典键值对数量
d.move_to_end(k, [last]) 将键为 k 的元素移动到最考前或最靠后位置 (last 默认为 True
d.pop(k, [default] 返回键 k 对应的值,并移除该键值对。没有 k 时返回 defaultNone
d.popitem() 有 (有可选参数 last ,默认为 False ,此时移除最早插入的键值对,否则移除最后插入的键值对) 随机返回一个键值对并从字典中移除
d.__reversed__() 返回倒序的键的迭代器
d.setdefault(k, [default]) 若字典里有键 k ,则把它对应的值设置为 default ,然后返回这个 值;若无,则让 d[k] = default ,然后返回 default
d.__setitem__(k, v) 实现 d[k] = v 操作
d.update(m, [**kargs]) m 可以是映射或键值对迭代器,用来更新 d 里对应的条目
d.values() 返回字典里的所有值

猜你喜欢

转载自juejin.im/post/7033302965817442335