dict | defaultdict | OrderdDict | 方法做用 | |
d.clear() | √ | √ | √ | 移除全部元素 |
d.__contains__(k) | √ | √ | √ | 检查 k 是否在 d 中 |
d.copy() | √ | √ | √ | 浅复制 |
d.__copy__() | √ | 用于支持 copy.copy | ||
.default_factory | √ | 在 __missing__ 函数中被调用的 |
||
d.__delitem__(k) | √ | √ | √ | del d[k],移除键为 k 的元素 |
d.fromkeys(it, |
√ | √ | √ | 将迭代器 it 里的元素设置为映射 |
d.get(k,[default]) | √ | √ | √ | 返回键 k 对应的值,若是字典里 没有键 k,则返回 None 或者 |
d.__getitem__(k) | √ | √ | √ | 让字典 d 能用 d[k] 的形式返回键 |
d.items() | √ | √ | √ | 返回 d 里全部的键值对 |
d.__iter__() | √ | √ | √ | 获取键的迭代器 |
d.keys() | √ | √ | √ | 获取全部的键 |
d.__len__() | √ | √ | √ | 能够用 len(d) 的形式获得字典里 |
d.__missing__(k) | √ | 当 __getitem__ 找不到对应键的 |
||
d.move_to_end(k, |
√ | 把键为 k 的元素移动到最靠前或 |
||
d.pop(k, [defaul] | √ | √ | √ | 返回键 k 所对应的值,而后移除 |
d.popitem() | √ | √ | √ | 随机返回一个键值对并从字典里 |
d.__reversed__() | √ | 返回倒序的键的迭代器 | ||
d.setdefault(k, |
√ | √ | √ | 若字典里有键k,则把它对应的值 |
d.__setitem__(k, |
√ | √ | √ | 实现 d[k] = v 操做,把 k 对应的 |
d.update(m, |
√ | √ | √ | m 能够是映射或者键值对迭代 |
d.values() | √ | √ | √ | 返回字典里的全部值 |
注:1.default_factory 并非一个方法,而是一个可调用对象(callable),它的值在defaultdict 初始化的时候由用户设定。
2.OrderedDict.popitem() 会移除字典里最早插入的元素(先进先出);同时这个方法还有一个可选的 last 参数,若为真,则会移除最后插入的元素(后进先出)(而dict和defaultdict则是随机移除);
3.dict.keys()在Python3中的返回值是一个“视图”。视图就像一个集合,并且跟字典相似的是,在视图里查找一个元素的速度很快;Python2中返回的是一个列表,查询慢。
有时候为了方便起见,就算某个键在映射里不存在,咱们也但愿在经过这个键读取值的时候能获得一个默认值。有两个途径能帮咱们达到这个目的,一个是经过 defaultdict 这个类型而不是普通的 dict,另外一个是给本身定义一个 dict 的子类,而后在子类中实现 __missing__ 方法。
步骤:
(1) 调用 list() 来创建一个新列表。
(2) 把这个新列表做为值,'new-key' 做为它的键,放到 dd 中。
(3) 返回这个列表的引用。而这个用来生成默认值的可调用对象存放在名为 default_factory 的实例属性里。
注:defaultdict 里的 default_factory 只会在__getitem__ 里被调用,在其余的方法里彻底不会发挥做用。好比,dd 是个 defaultdict,k 是个找不到的键, dd[k] 这个表达式会调用 default_factory 创造某个默认值,而 dd.get(k) 则会返回 None。
若是一个类继承了dict,且实现了__miss__()方法,则在调用__getitem__()方法找不到键时(即d["test"]没有这个键)不会直接抛出KeyError。
这个类型在添加键的时候会保持顺序,所以键的迭代次序老是一致的。
该类型能够容纳数个不一样的映射对象,而后在进行键查找操做的时候,这些对象会被看成一个总体被逐个查找,直到键被找到为止。
这个映射类型会给键准备一个整数计数器。每次更新一个键的时候都会增长这个计数器。通常用作计数。
倾向于从 UserDict 而不是从 dict 继承的主要缘由是,后者有时会在某些方法的实现上走一些捷径,致使咱们不得不在它的子类中重写这些方法,可是 UserDict 就不会带来这些问题。内置类型的方法不会调用子类覆盖的方法。例如,dict 的子类覆盖的 __getitem__() 方法不会被内置类型的get() 方法调用等。
注:
UserDict 并非 dict 的子类,可是UserDict 有一个叫做 data 的属性,是 dict 的实例,这个属性其实是 UserDict 最终存储数据的地方。这样作的好处是,UserDict 的子类就能在实现 __setitem__ 的时候避免没必要要的递归,也可让 __contains__ 里的代码更简洁。