collections模块
在内置数据类型(list ,tuple ,dict ,set)的基础上,collections提供了几个额外的数据类型:
1. namedtuple: 生成可以使用名字来访问元素内容的tuple
2. deque: 双端队列,可以快速的从另外一侧追加或取出元素
3. OrderedDict: 有序字典
4. defaultdict: 带有默认值的字典
5. Counter: 计数器,主要用来计数
namedtuple: 命名元组/有名元组
主要用于描述一类东西,这类东西都有相同的特征
from collections import namedtuple res = namedtuple('name',['x','y','z']) # ‘name’ 就是 元组名 []里面就是元组的 元素 ret = res(2,3,4) #传参 一一对应 print(ret) # name(x=2, y=3, z=4) print(ret.x) # 2 print(ret.y) # 3 print(ret.z) # 4
deque 双端队列
先说一下,Python还有个queque模块,支持Queue()单向队列:
import queue q = queue.Queue() print(q.empty()) # 判断Queue()队列是否为空, 返回True,就是空 #True q = queue.Queue(1) q.put(1) print(q.full()) #判断Queue()队列是否满了 #True q = queue.Queue() q.put(1) q.put(2) q.put('a') q.put('b') print(q.get()) # 1 先进先出 FIFO:first in first out print(q.get()) # 2 print(q.get()) # 3 print(q.get()) # 4 # print(q.get()) #4个元素,取了5次值,空了,get不到,就一直等待,程序不结束 print(q.get_nowait()) # 报错 queue.Empty get不到就停止并报错
list的线性存储
列表查询很快:索引查询
列表插入操作就费时间了:线性存储
线性存储:往列表中插入一个元素,插入位置后面的所有元素位置都要变化
双端队列:
打个比喻:list列表的append()方法,在后面尾巴添加,很快,不存在线性存储的问题,而双端对列就相当于有两个尾巴(无头),前面后面都可以append()
from collections import deque dq = deque() dq.append(1) dq.append(2) dq.appendleft('a') dq.appendleft('b') print(dq) #deque(['b', 'a', 1, 2]) print(dq.pop()) # 2 从后面取值 print(dq.popleft()) # b 从前面(左)取值
OrderedDict 有序字典
排列有序:
from collections import OrderedDict dic = dict([('a', 1), ('b', 2), ('c', 3)]) #创建字典的另一种方法 print(dic) # {'a': 1, 'c': 3, 'b': 2} dict的Key是无序的 od = OrderedDict( [ ('a', 1), ('b', 2), ('c', 3) ] ) print(od) #([('a', 1), ('b', 2), ('c', 3)]) OrderedDict的Key是有序的
取值顺序:
from collections import OrderedDict od = OrderedDict() od['a'] = 1 od['b'] = 2 od['c'] = 3 print(od.keys()) #有序字典取值: 先进先出 #odict_keys(['a', 'b', 'c'])
defaultdict: 默认字典 (默认值)
使用原生字典时,如果引用的key不存在,就会返回一个KeyError: ,如果想key不存在时,返回一个默认值,就用defaultdict
示例:
values = [11, 22, 33,44,55,66,77,88,99,90] #把大于66和小于66的元素分别放到字典的两个key中 my_dic = {} for i in values: if i > 66: if 'k1' in my_dic: # 需要先判断key是不是存在 my_dic['k1'].append(i) else:my_dic['k1'] = [i] # 如果不存在,还要先创建列表 elif i < 66: if 'k2' in my_dic: my_dic['k2'].append(i) else:my_dic['k2'] = [i] print(my_dic) #{'k2': [11, 22, 33, 44, 55], 'k1': [77, 88, 99, 90]}
如果使用默认字典 defaultdict
from collections import defaultdict #my_dic1 = defaultdict([]) #用了一个空列表TypeError: first argument must be callable or None my_dic1 = defaultdict(list) #如果key不存在,默认返回一个空列表 for i in values: if i > 66: my_dic1['k1'].append(i) elif i < 66: my_dic1['k2'].append(i) print(my_dic1) #defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55], 'k1': [77, 88, 99, 90]})
Counter 计数器
跟踪值出现的次数.
是一个 无序的 容器类型
以字典的键值对形式存储 元素(key):次数(value)
from collections import Counter c = Counter('abcdeabcdabcaba') print(c) # 输出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})