collections模块
collections模块
——数据类型扩展模块
有序字典
- python3.6后所有字典有序了
- 特殊用法:
- move_to_end(key)
from collections import OrderedDict
d = OrderedDict([('a',1),('b',2)])
d.move_to_end('a')
print(d)
输出结果:OrderedDict([('b', 2), ('a', 1)])
默认字典
- 作用:当访问一个字典的键不存在时,实例化一个值当做默认值
from collections import defaultdict
d = defaultdict(list)
print(d['a'])
print(d)
输出:
- 默认字典的实现机制:
- 第一步首先对默认字典进行默认赋值只有两种情况,第一种就是在通过
dict[key]
,第二种就是通过字典类中的__getitem__
方法才可以进行默认赋值- 直接对默认字典的进行对不存在的键值对的删除是会报错的
from collections import defaultdict
d = defaultdict(list)
d.pop('a') #删除一个没有的键值对
输出:
证明:并不是键值对一直就在里面,虽然可以有默认值,但是前提是需要创建
-
第二步通过子类中的
__missing__
特殊方法,对未存在的键进行赋值,触发__missing__
的机制就是dict[key]
和__getitem__
,从python2.5版本开始,如果派生自dict
的子类定义了__missing__()
方法,当访问不存在的键时,dict[key]
会调用__missing__()
方法取得默认值。字典类里是没有
__missing__
方法的,只有在派生子类中自己去实现
class Missing(dict):
def __missing__(self, key):
self[key] = list()
return 'default'
d = Missing()
d['Foo']
print(d)
输出的答案:
- 自主实现defaultdict类
class My_DefaultDict(dict):
def __init__(self,default_factory=None,**kwargs):
dict.__init__(self,**kwargs)
self.default_factory = default_factory
def __getitem__(self, key):
try:
return dict.__getitem__(self,key)
except KeyError:
return self.__missing__(key)
def __missing__(self, key):
if self.default_factory == None:
self[key] = value = self.default_factory
else:
self[key] = value = self.default_factory()
return value
d = My_DefaultDict(list)
d['a'].append(1)
print(d)
输出:
得出的结果和使用defaultdict实现的一样。
可命名元组(namedtuple)
- 作用:给元组取名
from collections import namedtuple
Msg = namedtuple('Msg',['name','sex','age'])
m1 = Course('Abner','male','22')
print(m1)
输出:Msg(name='Abner', sex='male', age='22')
- 优点:
-
保留了元组的特性
-
让用户可以明确了解每个值的明确含义
-
十分类似一个只有属性没有方法的类,列表中的就是属性名
这种类的特点,不能修改实例化的值了
双端队列(deque)
-
作用:可以补全list的缺点,insert速度过慢
-
什么是队列?
在python中有queue模块,队列类在该模块内,Queue类
队列的原则:先进先出,后进后出
-
功能:
q = queue.Queue() q.get() 拿到数据 q.put() 放数据
-
-
应用场景:排队抢票队列
-
双端队列的优势:在两边都可以取值
-
特殊方法
- dq.append() 在队列右侧追加
- dq.appendleft() 在队列左侧追加
- dq.pop() 删除队列末尾的一个元素
- dq.popleft() 删除第一个元素
- dq.rotate(n) 旋转,n为正数从左向右移n个元素,移除的元素在队列头补上
from collections import deque
dq = deque([1,2,3,4,5])
dq.rotate(-2)
print(dq)
输出:deque([3, 4, 5, 1, 2]) 向前推了两个元素
- 存储结构
每个元素都有前指针和后指针,确定自己所在位置
遇到insert不要使用list列表,因为效率过低,使用deque更优。
- 计数器(Counter)
作用:统计可迭代对象的元素出现次数
c = Counter('abcdeabcdabcaba')
print c
输出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
支持update:
from collections import Counter
c = Counter('adhskfgufhgfuhafkah')
print(c)
c.update('dhajhdakdhhf')
print(c)
输出:
Counter({'h': 4, 'f': 4, 'a': 3, 'k': 2, 'g': 2, 'u': 2, 'd': 1, 's': 1})
Counter({'h': 8, 'a': 5, 'f': 5, 'd': 4, 'k': 3, 'g': 2, 'u': 2, 's': 1, 'j': 1})