python-collections模块
简介
本篇主要介绍collections模块中的以下几样:
①计数器counter()
②有序字典OrderedDict()
③默认字典defaultdict()
④双向队列deque()
一、计数器counter()
counter 是一种特殊的字典,主要方便用来计数,它继承于dict类,因此具有dict类中所有的功能,此外,还具备了自己特有的功能
一小部分源码:
import collections obj=collections.Counter('aabbddsafd') #创建一个counter对象 print(obj) -----结果----- Counter({'a': 3, 'd': 3, 'b': 2, 's': 1, 'f': 1})
1.most_common()
统计出现次数最多的几个元素
import collections obj=collections.Counter('aabbddsafd') print(obj) print(obj.most_common(4)) #拿到前四位 -----结果------ [('a', 3), ('d', 3), ('b', 2), ('s', 1)]
2.更新update()
import collections obj=collections.Counter('aaabb') print(obj) obj.update([11,22,'a']) print(obj) -----结果----- Counter({'a': 3, 'b': 2}) Counter({'a': 4, 'b': 2, 11: 1, 22: 1})
3.删除元素subtract()
import collections obj=collections.Counter('aaabb') print(obj) obj.subtract(['a','11']) print(obj) -----结果----- Counter({'a': 3, 'b': 2}) Counter({'a': 2, 'b': 2, '11': -1})
注意:使用subtract()时,如果元素不够扣除,相应元素的个数会以负数的形式展示
4.获取元素elements()
用counter()产生的对象,看上去像一个字典,其实并不是真实的字典,想要取其中的元素,得用elements()去获取
import collections obj=collections.Counter('aabbddsafd') for k in obj.elements(): print(k) -----结果----- a a a b b . .
注意:如果想要取出其中key和values,得用dict类中的方法
import collections obj=collections.Counter('aabbddsafd') for k,v in obj.items(): print(k,v) -----结果----- a 3 b 2 d 3 s 1 f 1
二、有序字典OrderedDict()
创建一个有序字典:
import collections dic=collections.OrderedDict() dic['k1']='v1' dic['k2']='v2' dic['k3']='v3' print(dic) -----结果----- OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
1.移动到末尾move_to_end()
import collections dic=collections.OrderedDict() dic['k1']='v1' dic['k2']='v2' dic['k3']='v3' dic.move_to_end('k1') print(dic) -----结果----- OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
2.删除pop()与popitem()
#pop() import collections dic=collections.OrderedDict() dic['k1']='v1' dic['k2']='v2' dic['k3']='v3' dic.pop('k1') print(dic) -----结果----- OrderedDict([('k2', 'v2'), ('k3', 'v3')]) #popitem() import collections dic=collections.OrderedDict() dic['k1']='v1' dic['k2']='v2' dic['k3']='v3' dic.popitem() print(dic) -----结果----- OrderedDict([('k1', 'v1'), ('k2', 'v2')])
对比结果可知,popitem()是去除最后一个元素,且其中不需要加入参数值,pop()是删除指定的元素,其中需要加入参数值,且删除的值可重新生成一个对象
3. 设定默认值
import collections dic=collections.OrderedDict() dic['k1']='v1' dic['k2']='v2' dic['k3']='v3' dic.setdefault('k4') #当不指定值的时候,默认为None,效果等同于dic['k4']=None print(dic) -----结果----- OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3'), ('k4', None)])
三、默认字典defaultdict()
作用:定义一个字典,让这个字典的值默认为某个类型
创建一个默认字典:
import collections dic = collections.defaultdict(list) #对字典里值设置为list类型 dic['k1'].append('test001') #append是list类才有的方法,由于设了默认类型,才能用 print (dic) -----结果----- defaultdict(<class 'list'>, {'k1': ['test001']})
四、可命名元组nametuple()
通常的元组,如果想要访问里面的元素,是只能通过索引去访问,如t[0]。而在可命名元组中,则可以针对每个元素定义一个名字,通过名字去访问相应的名字
注意:在collections包中,可命名元组与其他不同的是:创建计数器、有序字典这些对象时,都是由相应的类产生的,但是,在该包中,没有"可命名元组"这个类,
想要使用可命名元组,首先得创建一个类。通过nametuple()这个方法,去创建相应的类
import collections MytupleClass=collections.namedtuple('MytupleClass',['x','y','z']) #创建类MytoupleClass obj=MytoupleClass(11,22,33) #通过类创建了对象,其中x=11,y=22,z=33 print(obj.x) print(obj.y) print(obj.z) -----结果----- 11 22 33
其中,MytupleClass是创建的类,obj为该类创建的对象,想看查看该类下面有哪些功能,可以使用如下方法:
print(help(MytupleClass))
部分截图如下:
五、双向队列deque()
队列是类似于栈一样的一种数据结构
单向队列:先进先出,一端进,另一端出
双向队列:在一端可以进和出,在另一端也可进和出
1.添加元素
import collections d=collections.deque() d.append('a') #从右边添加 d.append('b') d.appendleft(1) #从左边添加 d.appendleft(2) print(d) print(d.count('a')) #用count()统计元素出现的个数 -----结果----- deque([2, 1, 'a', 'b']) 1
2.扩展元素
import collections d=collections.deque() d.extend(['aa','bb']) #从右侧扩展 d.extendleft([11,22]) #从左侧扩展 print(d) -----结果----- deque([22, 11, 'aa', 'bb'])
3.获取索引位置
import collections d=collections.deque([1,2,3]) print(d.index(1)) -----结果----- 0
4.删除
import collections d=collections.deque([1,2,3]) d.pop() #从右侧删除 print(d) d.popleft() #从左侧删除 print(d) -----结果----- deque([1, 2]) deque([2])
5.移动元素至首位
import collections d=collections.deque([a,b,c]) d.rotate(1) # 把最后一个元素放到首位 print(d) -----结果----- deque([c, a, b])
其余一些方法不一一介绍....
六、单向队列
单向队列不属于collections包中,而在queue包中
创建一个单向队列
import queue q=queue.deque()
单向队列的方法在此文中不做介绍