「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」
defaultdict
位于 collections
模块内。
在实例化一个 defaultdict
的时候,需要给构造方法提供一个可调用对象,这个可调用对象会在 __getitem__
碰到找不到的键的时候被调用,让 __getitem__
返回某种默认值。这个用来生成默认值的可调用对象存放在名为 default_factory
的实例属性里。
举个栗子
d = collections.defaultdict(list) # 一个空字典
d['key'] # []
d.get('key') # None
复制代码
OrderedDict
位于 collections
模块内。
这个类型在添加键的时候会保持顺序,因此键的迭代次序总是一致的。
OrderedDict
的 popitem
方法默认删除并返回的是字典里的最后一个元素,但是如果像 my_odict.popitem(last=False)
这样调用它,那么它删除并返回第一个被添加进去的元素。
字典们的抽象基类
collections.abc
模块中有 Mapping
和 MutableMapping
这两个抽象基类,它们的作用是为 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 |
dict
、defaultdict
、OrderDict
方法对比
[]
中为可选参数。
方法/对象 | 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 时返回 default 或 None |
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 时返回 default 或 None |
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() |
有 | 有 | 有 | 返回字典里的所有值 |