collections容器数据类型是对基本数据类型的补充,简单介绍下计数器、有序字典、默认字典、可命名元祖、队列。
计数器(Counter)
Counter是对字典类型的补充,用于追踪值得出现次数
class Counter(dict)
import collectionsobj = collections.Counter('asiwenaohweiatgwho')print(obj)
def most_common() # 返回一个列表
def elements() # elements用来循环Counter元素# 取到keysfor item in obj.elements(): print(item) # 取到key和valuefor k,v in obj.items(): print(k,v) # 循环elements -> 得到原始数据# 循环obj -> 得到处理完的数据
def update() # 更新Counterobj.update(['eric',11,11])更新计数器,如果原来没有,则新建,如果有则加1
def subtract() # 减少,可以为负
有序字典(OrderedDict)
对字典类型的补充,记住了字典元素添加的顺序
class OrderedDict(dict)dic = collections.OrderedDict()# 字典 dic = {'k1':'v1','k2':'v2'}# 列表 li = ['k1','k2']# for i in li:# print(dic[i])
#!/usr/bin/env python3import collections# dic = dict()dic = collections.OrderedDict()dic['k1'] = 'v1'dic['k2'] = 'v2'dic['k3'] = 'v3'print(dic)
def move_to_end() # 把一个已存在的元素移到队尾dic.move_to_end('k1')
def popitem() # 删除并返回,总是按照LIFO顺序,栈# 按照后进先出的顺序,栈dic.popitem() def pop() # 删除指定的k,并返回vdic.pop('k2') # 有返回值v2
dic['k4'] = Nonedic.setdefault('k4') # 这两句效果等同dic.update({'k1':'xx','k2':'yy'})
默认字典(defaultdict)
定义一个字典,让字典的值默认是个什么类型
dic = collections.defaultdict(list)dic['k1'].append('alex')print(dic)
from collections import defaultdictvalues = [11,22,33,44,55,66,77,88,99]my_dict = defaultdict(list)for value in values: if value > 66: my_dict['k1'].append(value) else: my_dict['k2'].append(value)
可命名元祖(namedtuple)
默认元祖是通过索引去访问,可命名元祖可以通过命名参数去访问
创建可命名元祖,需要先创建类,通过类再去创建可命名元祖import collections#先去创建类MytupleClass = collections.namedtuple('MytupleClass',['x','y','z']) # 创建MytupleClass类dir(MytupleClass)obj = MytupleClass(11,22,33)print(obj.x)print(obj.y)print(obj.z)obj._asdict() #返回一个有序字典OrderedDict
队列
python提供了两种队列:单向队列和双向队列
双向队列 deque
import collectionsdq = collections.deque() # 创建双向队列dq.append()dq.appendleft()dq.clear()dq.count()dq.extend()dq.extendleft()dq.pop() #从右边取dq.popleft() # 从左边取dq.remove() #从左往右删除dq.reverse()dq.rotate(n) #轮训,从左往右轮询n个值,如果n为负数,则往左轮询
单向队列 先进先出FIFO
# epoll# 单向队列,不在collections模块中,在queue中import queueq = queue.Queue(N) #创建一个长队为N的单向队列,如果N省略,则无穷大q.qsize() #返回队列的长度q.empty() #如果队列为空,则返回True,否则返回Falseq.full() #如果队列已满,则返回True,否则返回Faluseq.put('123') #put一个元素到队列尾部q.get() #从队列头部移除并返回一个元素,FIFO