collections是日常工作中的重点、高频模块,包含了一些特殊的容器,针对Python内置的容器,例如list、dict、set和tuple,常用类型有:
namedtuple,可以创建包含名称的tuple;
deque,双边队列,类似于list的容器,可以快速的在队列头部和尾部添加、删除元素;
Counter,dict的子类,计算可hash的对象;
OrderedDict,dict的子类,可以记住元素的添加顺序;
defaultdict,dict的子类,可以调用提供默认值的函数;
default_factory
默认字典,字典的一个子类,继承所有字典的方法,默认字典在进行定义初始化的时候得指定字典值有默认类型。
Python中通过Key访问字典,当Key不存在时,会引发‘KeyError’异常。通过使用collections类中的defaultdict()方法可以为字典提供默认值。
语法格式:
collections.defaultdict([default_factory[, …]])
1.第一个参数为default_factory属性提供初始值,默认为None;其余参数包括关键字参数(keyword arguments)的用法,和dict构造器用法一样。
from collections import defaultdict
s=[('yellow',1),('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d=defaultdict(list)
for k, v in s:
d[k].append(v)
a=sorted(d.items())
print(a)
output
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
2.defaultdict还可以被用来计数,将default_factory设为int即可。default_factory函数调用int()为其提供一个默认值0,加法操作将计算出每个字母出现的次数。
函数int()是常值函数的一种特例,总是返回0
from collections import defaultdict
s = 'okokokokooooooooollll'
d = defaultdict(int)
for k in s:
d[k] += 1
print(d)
a=sorted(d.items())
print(a)
output:
defaultdict(<class 'int'>, {'o': 13, 'k': 4, 'l': 4})
[('k', 4), ('l', 4), ('o', 13)]
3.defaultdict它重写了方法 missing(key),增加了一个可写的实例变量default_factory,实例变量default_factory被missing()方法使用,如果该变量存在,则用以初始化构造器,如果没有,则为None。其它的功能和dict一样。使用匿名函数(lambda function)可以更快、更灵活的创建常值函数,返回任意常数值。
from collections import defaultdict
def constant_factory(value):
return lambda: value
d = defaultdict(constant_factory('<missing_flag_test>'))
print('\n',d)
d.update(name='Hensel', action='left')
print('\n',d)
print('\n','%(name)s %(action)s to %(object)s' % d)
output:
defaultdict(<function constant_factory.<locals>.<lambda> at 0x7f830baf5598>, {})
defaultdict(<function constant_factory.<locals>.<lambda> at 0x7f830baf5598>, {'name': 'Hensel', 'action': 'left'})
Hensel left to <missing_flag_test>
4.default_factory设为set时,可以用defaultdict建立集合字典(a dictionary of sets)。
from collections import defaultdict
s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
d = defaultdict(set)
for k, v in s:
d[k].add(v)
print(d)
a=sorted(d.items())
print(a)
output:
defaultdict(<class 'set'>, {'red': {1, 3}, 'blue': {2, 4}})
[('blue', {2, 4}), ('red', {1, 3})]
deque
deque是双端队列(double-ended queue)的缩写,由于两端都能编辑,deque既可以用来实现栈(stack)也可以用来实现队列(queue)。
相比于list实现的队列,deque实现拥有更低的时间和空间复杂度。list实现在出队(pop)和插入(insert)时的空间复杂度大约为O(n),deque在出队(pop)和入队(append)时的时间复杂度是O(1)。
常用方法:
func | 作用 |
---|
append | 追加元素到队列 |
appendleft | 队列左边添加元素 |
clear | 清空队列中的所有元素 |
count | 返回队列中包含value的个数 |
extend | 队列右边扩展,可以是列表、元组或字典,如果是字典则将字典的key加入到deque |
extendleft | 同extend,在左边扩展 |
pop | 移除并返回队列右边的元素 |
popleft | 移除并返回队列左边的元素 |
remove(value) | 移除队列第一个出现的元素 |
reverse | 队列的所有元素进行反转 |
rotate(n) | 对队列数进行移动 |
![在这里插入图片描述](https://img-blog.csdnimg.cn/c0cd7a0b807f4816a6d2aa2d8458aece.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAU2ltcGxpY2l0eV8=,size_20,color_FFFFFF,t_70,g_se,x_16)
deque也支持in操作符,可以使用如下写法:
q = collections.deque([1, 2, 3, 4])
print(5 in q) # False
print(1 in q) # True
deque还封装了顺逆时针的旋转的方法:rotate
# 顺时针
q = collections.deque([1, 2, 3, 4])
q.rotate(1)
print(q) # [4, 1, 2, 3]
q.rotate(1)
print(q) # [3, 4, 1, 2]
# 逆时针
q = collections.deque([1, 2, 3, 4])
q.rotate(-1)
print(q) # [2, 3, 4, 1]
q.rotate(-1)
print(q) # [3, 4, 1, 2]
参考
https://www.jianshu.com/p/47f66ff4ab7b
https://www.cnblogs.com/xiaobingqianrui/p/8483118.html
https://blog.csdn.net/yangsong95/article/details/82319675
https://www.cnblogs.com/lincappu/p/12890765.html
https://www.cnblogs.com/volcao/p/8728102.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)