collections模块:在内置数据类型(dict list set tuple)的基础上,collections模块还提供了额外的数据类型:Counter\deque\defaulidict\namedtuple和OrderedDict等
1、namedtuple:生成可以使用名字来访问元素内容的tupe (常用于坐标、html标签的长宽)
2、deque:双端队列,可以快速的从另一侧追加和推出对象(与单向队列比,单向队列只能一头放,另一头取)
3、Counter:计数器,主要用来计数
4、OrderedDict:有序字典
5、defaultdict:带有默认值的字典
namedtuple
可命名元组,给元组每个元素起一个名字,这样就可以通过名字来访问元组里的元素,增强了可读性;尤其对于坐标,html标签的长宽等,使用名字可读性更强;有点类似于字典了
格式 namedtuple('名称',[属性list])
from collections import namedtuple # tuple 元组--不可变的数据类型 # namedtuple -- 可命名元组 # 格式:namedtuple('描述名',[列表]) # 需求,描述一个坐标 p = (1,2) print(p) point = namedtuple('point',['x','y']) p = point(1,2) print(p.x) print(p.y) print(p) # 注意:列表中的元素,你定义了多少个,就要传多少个元素进去,少一个多一个都不行 p1= point(1,2,3) print(p1) # 正确操作 point = namedtuple('point',['x','y','z']) p1 = point(1,2,3) print(p1)
from collections import namedtuple point = namedtuple('point',['x','y']) p = point(1,2) print(p) print(p.x) print(p.y) # 如果用坐标和半径表示一个圆 aa = namedtuple('bb',['x','y','z']) a= aa(1,2,3) print(a) print(a.x) print(a.y) print(a.z) # 一个实用的例子--答应访问站点对应的用户名和密码 from collections import namedtuple login_user = [ ('baidu.com','jerry','123'), ('souhu.com','tom','111'), ('sina.com','amy','223'), ] page_info = namedtuple('login_info',['url','username','password']) for user in login_user: msg = page_info(*user) # 参考*args *args 用来将参数打包成tuple给函数体调用 print(msg)
deque
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢,因为list是线性存储,数据量大的时候,插入和删除效率很低
deque是为了高效实现插入和删除的操作的双向列表,适合用于队列和栈
# deque -- 双端队列 # 队列--先进先出--queue--FIFO--如排队买票 # 堆栈--先进后出 import queue q = queue.Queue() # 创建一个空的队列 q.put([1,2,4]) q.put(5) q.put(1) print(q) # 返回一个内存地址,相当于q是一个空管道,你可以往管道里放球,遵循先进先出 print(q.qsize()) # 获取队列的大小,如果为0就表明是空队列 print(q.get()) print(q.get()) print(q.get()) print(q.get()) # 因为只有三个值,第四个值取不到,就一直堵着----阻塞
from collections import deque l = [1,2,3] li = deque(l) # 从单端队列 转为 双端队列 print(li) li.append(4) # 默认从右侧添加 print(li) li.appendleft(0) # 从左侧添加 print(li) li.pop() # 默认从右侧开始删除 print(li) li.popleft() # 从左侧开始删除 print(li) li.extend([4,5,6]) # 默认从右侧拓展 print(li) li.extendleft([-3,-2,-1]) # 从左侧拓展 print(li)
OrderedDict
使用字典是,字典的key是无序的,在对字典做迭代时,我们无法确定key的顺序;
如果要保持key的顺序,可以用OrderedDict
创建字典 d = dict([('a', 1), ('b', 2), ('c', 3)]) print(d) # 字典的Key是无序的 #创建有序字典 from collections import OrderedDict dic_d = OrderedDict(d) # OrderedDict的key是有序的,且key会按照插入的顺序排列,不是key本身来排序。 print(dic_d) # OrderedDict的key是有序的,且key会按照插入的顺序排列,不是key本身来排序。 od = OrderedDict() od['z'] = 1 od['y'] = 2 od['x'] = 3 print(od.keys())
defaultdict
默认字典,为字典设置一个默认类型;
# 如一下列表[11,22,33,44,55,66,77,88,99],将所有大于66的值保存至字典的第一个key中,将小于66的值保存至第二个key中 # 即 {‘k1’:大于66,‘k2’:小于66} l = [11,22,33,44,55,66,77,88,99] d = {} for i in l: if i > 66: if 'k1' not in d.keys(): d.setdefault('k1', []) d['k1'].append(i) else: d['k1'].append(i) else: if 'k2' not in d.keys(): d.setdefault('k2', []) d['k2'].append(i) else: d['k2'].append(i) print(d) # 使用defaultdict from collections import defaultdict dic = defaultdict(list) # 默认所有Value是list,注意:defaultdict(可被调用的数据类型) for v in l: if v>66: dic['k1'].append(v) else: dic['k2'].append(v) print(dic) people = [['male', 'winter'], ['female', 'elly'], ['male', 'frank'], ['female', 'emma']] #将男性女性分开,所有男性放到'male'中,所有女性放放到'female'中 gender_sort = {} for info in people: if info[0] in gender_sort: gender_sort[info[0]].append(info[1]) else: gender_sort[info[0]] = [info[1]] print(gender_sort) # 使用 defaultdict gender_sort = defaultdict(list) for info in people: gender_sort[info[0]].append(info[1]) print(gender_sort)
Counter
Counter 类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式储存,其中元素作为Key,其计数作为value。
计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或者muitisets很相似。
from collections import Counter c = Counter('abcabcabcabcabcabcabcabcabcabc') print(c)