python 19 collections模块
collections
在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:
Counter、deque、defaultdict、namedtuple和orderedDict等。
1.namedtuple:生成可以使用名字来访问元素内容的tuple 2.deque:双端队列,可以快速的从另外一侧追加和推出对象 3.Counter:计数器,主要用来计数 4.orderedDict:有序字典 5.defaultdict:带有默认值的字典
namedtuple
我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:
p = (1,2)
但是,看到(1,2),很难看出这个tuple是用来表示一个坐标的
这时,namedtuple就派上用场:
from collections import namedtuple Point = namedtuple('Point',['x','y']) p = Point(1,2) print(p.x) print(p.y)
类似的,如果要用坐标和半径表示一个圆,也可以用namedtuple定义:
from collections import namedtuple # namedtuple('名称',[属性list]) Circle = namedtuple('Circle',['x','y','r']) p1 = Circle(1,2,3) p2 = Circle(3,2,1) print(p1,p2)
花色和数字
from collections import namedtuple Card = namedtuple('card',['suits','number']) c1 = Card('红桃',2) print(c1) print(c1.suits) print(c1.number)
队列 queue
import queue q = queue.Queue() q.put([1,2,3]) q.put(5) q.put(6) print(q) print(q.get()) print(q.get()) print(q.get()) print(q.get()) # 这行没有值,但一直在这,叫阻塞 print(q.qsize())
deque
使用list存储数据时,按索引访问元素,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,
插入和删除效率很低
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
from collections import deque dq = deque([1,2]) dq.append('a') # 从后面放数据[1,2,'a'] dq.appendleft('b') # 从前面放数据['b',1,2,'a'] dq.insert(2,3) # ['b',1,3,2,'a'] print(dq) print(dq.pop()) # 从后面取数据 a print(dq.pop()) # 从后面取数据 2 print(dq.popleft()) # 从前面取数据 b print(dq)
OrderedDict 有序字典
使用dict时,key是无序的,在对dict做迭代时,我们无法确定key的顺序。
如果要保持key的顺序,可以用OrderdDict:
from collections import OrderedDict d = dict([('a',1),('b',2),('c',3)]) print(d) # dict的key是无序的 {'c': 3, 'a': 1, 'b': 2} od = OrderedDict([('a',1),('b',2),('c',3)]) print(od)
对于字典的操作都可以对有序字典操作
print(od['a']) for i in od: print(i)
注意:OrderedDict的key会按照插入的顺序排列
od = OrderedDict() od['z'] = 1 od['y'] = 2 od['x'] = 3 print(od.keys()) for i in od: print(i)
defaultdict 默认字典
有如下集合[11,22,33,44,55,66,77,88,99,90...],将所有大于66的值保存至字典的第一个key中,将小于
66值保存至第二个key的值中。
即:{'k1':大于66,'k2':小于66}
原来的老方法
values = [11,22,33,44,55,66,77,88,99,90] my_dict = {} for value in values: if value > 66: if 'k1' in my_dict: my_dict['k1'].append(value) else: my_dict['k1'] = [value] elif value < 66: if 'k2' in my_dict: my_dict['k2'].append(value) else: my_dict['k2'] = [value] else: continue print(my_dict)
用defaultdict实现
from collections import defaultdict values = [11,22,33,44,55,66,77,88,99,90] my_dict = defaultdict(list) for value in values: if value > 66: my_dict['k1'].append(value) else: my_dict['k2'].append(value) print(my_dict) 使用dict时,如果引用的key不存在,就会抛出keyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict: from collections import defaultdict dd = defaultdict(lambda :'N/A') dd['k1'] = 'abc' print(dd['k1']) print(dd['k2'])