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

1,227 阅读3分钟

「这是我参与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, valuesContainer , Iterable , Sized
MutableMappint__setitem__ , __delitem__ , clear , pop , popitem , setdefault , updateMapping

dictdefaultdictOrderDict 方法对比

[] 中为可选参数。

方法/对象dictdefaultdictOrderDict说明
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()返回字典里的所有值