collections是Python标准库,其中很多类都能能使我们代码更为简洁,处理更为方便。
- namedtuple(): 生成可以使用名字来访问元素内容的tuple子类
- deque: 双端队列,可以快速的从另外一侧追加和推出对象
- OrderedDict: 有序字典
- defaultdict: 带有默认值的字典
- Counter: 计数器,主要用来计数
namedtuple()
可以使用名称来访问 tuple 中的数据对象。假设我们要表示空间中的一个点 p(1, 2, 3),并且想以 p.x p.y p.z 的形式访问其中数据,单独建一个类可以,但没必要,这就可以用 namedtuple() 来做了
输入:
from collections import namedtuple
point = namedtuple('point', ['x', 'y', 'z'])
p = point(1, 2, 3)
print(p.x, p.y, p.z)
输出:
1 2 3
deque()
deque 是双头队列,它最大的好处就是实现了从队列头部快速增加和取出对象: appendleft() , popleft(),。
你可能会说,原生的list也可以从头部添加和取出对象啊?就像这样:
l.insert(0, v)
l.pop(0)
但是值得注意的是,list对象的这两种用法的时间复杂度是 O(n) ,也就是说随着元素数量的增加耗时呈线性上升。而使用deque对象则是 O(1) 的复杂度,所以当你的代码有这样的需求的时候,一定要记得使用deque。
作为一个双端队列,deque还提供了一些其他的好用方法,比如 rotate 等。
from collections import deque
q=deque(['b', 'c'])
q.popleft()
q.appendleft('a')
print(q)
输出:
deque(['a', 'c'])
defaultdict()
使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用 defaultdict:
from collections import defaultdict
# 两种常见的用途
# 字典a,如果要查找的数据不存在,则返回预先设定的值
a=defaultdict(lambda:'N/A')
a[1]='a'
print(a[1]+'\n'+a[2])
输出:
a
N/A
# 字典b,想要统计一组数据中各个类别的个数时常用
b=defaultdict(int) # 如果想查找的 key 不在字典中,则返回0
test=['a','a','b','c','c','d'] # 统计每个字母出现的个数
for x in test:
b[x] += 1
print(b)
输出:
defaultdict(<class 'int'>, {'a': 2, 'b': 1, 'c': 2, 'd': 1})
OrderedDict()
使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。
如果要保持Key的顺序,可以用OrderedDict:
from collections import OrderedDict
d = dict([('a', 1), ('b', 2), ('c', 3)])
print(d) # dict的Key是无序的
输出:
{'a': 1, 'c': 3, 'b': 2}
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od) # OrderedDict的Key是有序的
输出:
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
注 意 : \color{red}{注意:} 注意:OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:
od = OrderedDict()
od['z'] = 1
od['y'] = 2
od['x'] = 3
od.keys() # 按照插入的Key的顺序返回
输出:
['z', 'y', 'x']
Counter()
Counter是一个简单的计数器,例如,统计字符出现的个数:
from collections import Counter
c = Counter()
for ch in 'aabccda':
c[ch] += 1
print(c)
输出:
Counter({'a': 3, 'b': 1, 'c': 2, 'd': 1})
或是:
from collections import Counter
a='aabbcdd'
c=Counter(a)
c.most_common()
输出:
[('a', 2), ('b', 2), ('d', 2), ('c', 1)]
most_common() 是 counter() 下的一个方法,用元组的形式显示数据项及其出现次数。