python中的内置容器dict
, list
, tuple
, set
通常能处理日常大部分的问题,但对于一些特殊的应用场景,用这几种内置容器无法简洁高效的实现需求,所以python官方内置了collections
模块——提供了一些替换Python的通用内置容器的备选容器。
OrderedDict有序字典
dict
在Python3.6之前是无序的,而collections
中的集合OrderedDict
就相当于一个有序字典,插入顺序就是遍历的顺序。
而在Python3.6之后,默认的dict
就已经是有序字典了,dict
内部的数据结构保留了插入的顺序,并且效率比原来的dict
更高。
但为了兼容性的原因,目前还是推荐使用OrderedDict
。
1 | from collections import OrderedDict |
defaultdict默认字典
defaultdict
相比于dict
就是每个键对应的值可以指定一个默认值。
在开发中经常会遇到这样一个场景:用所给的数据构建一个字典,要每个键对应一个列表,列表中存储相应的数据,像是user_dict = {"a": [0, 1], "b": [3]}
这样;我们在构建这个字典的时候要考虑a
是第一次插入还是第一次之后,因为第一次插入首先要user_dict["a"] = []
然后再执行append
操作,而第一次之后就只需要append
就可以了。
在类似这种场景下使用defaultdict
可以使两个逻辑一致。
1 | from collections import defaultdict |
namedtuple命名元组
我们都知道tuple
是不可变的,而namedtuple
也是如此,并且namedtuple
之所以叫命名元组正是因为它还可以用属性名来访问值,当然也可以用索引(tuple
的特性)。
namedtuple
是一个函数,返回的是一个类,再通过namedtuple
创建的类来创建对象。所以namedtuple
可以快速的定义一些数据结构而不需要定义类来实现,同时因为tuple
的不可变性,还可以用它来存储常量。
1 | from collections import namedtuple |
Counter计数器
Counter
是一个简单计数器,计算可迭代序列中各元素的数量。
Counter
是dict
的子类
1 | from collections import Counter |
deque双端队列
deque
相比list
具有更高效的插入和删除操作,并且支持双向的插入删除,适用于队列和栈。
1 | from collections import deque |
ChainMap链式字典
ChainMap
在平时我并没有使用过,通过官方文档和网上资料得知ChainMap
用于创建多个字典连接在一起的单个视图,在视图上的操作会直接反映到连接起来的dict
中。
换句话说:ChainMap
用于连接多个字典,在ChainMap
上查找就是在连起来的dict
中进行查找,在ChainMap
上进行写入删除就是在对应的dict
中进行操作,我们可以把ChainMap
看成一个大的字典。
1 | import builtins |