collections模块是一个不需要知道的模块,用过就会上瘾。这里主要介绍OrderedDict类、defaultdict类、Counter类、namedtuple类和deque类。常见的集合类型集合有:计数器(Counter)双向队列(deque)默认字典(defaultdict)有序字典(OrderedDict)可命名元组(namedtuple)计数器计数器(counter)返回序列中每个字符出现的次数dictionary的形式,value为key,次数为valueCounter是对dictionary类型的补充,用于跟踪value出现的次数。importcollectionscounter=collections.Counter("MynameisRunsen")print(counter)输出如下Counter({'':3,'n':3,'e':2,'s':2,'M':1,'y':1,'a':1,'m':1,'i':1,'R':1,'u':1})得到元素重复个数的值print(counter[''])3elements()获取计数器中的所有元素。注意:这不是所有元素的集合,而是包含所有元素集合的迭代器。counter=collections.Counter('abcabcabcdabcdef')print(counter)#输出如下Counter({'a':4,'b':4,'c':4,'d':2,'e':1,'f':1})print(counter.elements())#输出如下print(list(counter.elements()))#输出结果如下['a','a','a','a','b','b','b','b','c','c','c','c','d','d','e','f']将Counter按照值从大到小排列,得到第N个元素,需要用函数most_common#most_common(N)从大到小排列,得到前N个元素print(counter.most_common(3))#输出如下[('a',4),('b',4),('c',4)]sorted会对Counter中的key进行排序,返回所有key的列表#sorted()列出所有不同的元素并进行排序print(sorted(counter))#输出如下['a','b','c','d','e','f']将Counter转成字符串,j字符串的oin方法可以解决。请注意,这不是原来的样子。#转换成字符串print(''.join(counter.elements()))#aaaabbbbccccddefprint(''.join(list(counter.elements())))update()更新计数器,其实就是更新计数器在原来的计数器中,如果没有,则新建一个key,如果有值,则添加一个#update()更新计数器,d=collections.Counter('a')counter.update(d)print(counter)#输出如下Counter({'a':5,'b':4,'c':4,'d':2,'e':1,'f':1})update()更新计数器,然后subtract()减去计数器的值,即减去原计数器的元素个数后添加的元素个数counter.subtract('abdabcabcg')print(counter)#输出如下Counter({'a':2,'c':2,'b':1,'d':1,'e':1,'f':1,'g':-1})dequedeque支持从任一端添加和删除元素。最常用的两种结构是栈和队列。deque的常用操作#定义一个空的双向队列d=collections.deque()#从右边开始添加元素d.extend("Runsen")d.append("Maoli")d.append("Python")d.append("king")#从左边增加元素d.appendleft('left')print(d)#输出结果如下(注意:extend和append的区别)deque(['left','R','u','n','s','e','n','Maoli','Python','king'])#reverse()反向队列print(d.reverse())d.reverse()print(d)#输出结果如下Nonedeque(['king','Python','Maoli','n','e','s','n','u','R','left'])d.reverse()d.extend(['qq','ww','ee'])print(d)#deque(['left','R','u','n','s','e','n','毛力','Python','king','qq','ww','ee'])#count()countprint(d.count('R'))#输出如下1#clear()清空队列d.clear()print(d)#输出如下deque([])#index()获取元素下标print(d.index('Maoli'))#输出结果如下7#insert()在指定位置插入元素d.insert(1,'Runsen')print(d)#deque(['left','润生',R','你','n','s','e','n','Maoli','Python','king','qq','ww','ee'])OrderedDict使用时保持键的顺序字典,你可以使用OrderedDict。fromcollectionsimportOrderedDictdic=OrderedDict()dic['k1']='v1'dic['k2']='v2'dic['k3']='v3'print(dic)#输出结果如下OrderedDict([('k1','v1'),('k2','v2'),('k3','v3')])#字典的所有keyprint(dic.keys())#输出如下odict_keys(['k1','k2','k3'])#字典的所有值print(dic.values())#输出结果如下odict_values(['v1','v2','v3'])#items()方法返回一个可遍历的list(key,value)元组数组print(dic.items())#输出结果如下odict_items([('k1','v1'),('k2','v2'),('k3','v3')])#pop()方法,删除指定键值dic.pop('k1')print(dic)#输出如下OrderedDict([('k2','v2'),('k3','v3')])#popitem()方法,默认删除字典的最后一个元素dic.popitem()print(dic)#输出如下OrderedDict([('k2','v2')])#update()更新字典dic.update({'k1':'v1111','k10':'v10'})print(dic)#输出如下OrderedDict([('k2','v2'),('k1','v1111'),('k10','v10')])OrderedDict和字典的操作完全一样,不同的是OrderedDict的Key会按照插入的顺序排列,而不是Key本身的排序>>>fromcollectionsimportOrderedDict>>>d=dict([('a',1),('b',2),('c',3)])>>>d#dict键无序{'a':1,'c':3,'b':2}>>>od=OrderedDict([('a',1),('b',2),('c',3)])>>>od#OrderedDict的Key是有序的OrderedDict([('a',1),('b',2),('c',3)])defaultdict使用字典时,如果在使用不存在的key时出现KeyError等错误,则应该出现defaultdict。defaultdict接受一个工厂函数作为参数构造:dict=defaultdict(factory_function)这个factory_function可以是list、set、str等,作用是当key不存在时,返回工厂函数的默认值。比如list对应[],str对应空字符串,set对应set(),int对应0,例如:fromcollectionsimportdefaultdictdict1=defaultdict(int)dict2=defaultdict(set)dict3=defaultdict(str)dict4=defaultdict(list)dict1[2]='two'print(dict1[1])print(dict2[1])print(dict3[1])print(dict4[1])#输出如下0set()[]defaultdict类接受类型名作为初始化函数的参数,从而使默认值的取值更加灵活。s='mynameisrunsen'd=collections.defaultdict(int)forkins:d[k]+=1print(d)#输出如下defaultdict(,{'m':2,'y':1,'n':3,'a':1,'e':2,'i':1,'s':2,'r':1,'u':1})练习有以下内容一组值[11,22,33,44,55,66,77,88,99,99]。下面将所有大于55的值保存到字典的第一个键,将小于55的值保存到第二个键的值。该列表由defaultdict下面的默认字典划分。all_list=[11,22,33,44,55,66,77,88,99]dic=collections.defaultdict(list)foriinal_list:ifi>55:dic['k1'].append(i)else:dic['k2'].append(i)print(dic)#输出如下defaultdict(,{'k2':[11,22,33,44,55],'k1':[66,77,88,99]})也可以用字典,具体代码如下。all_list=[11,22,33,44,55,66,77,88,99]dic={}foriinall_list:ifi>55:if"k1"indic.keys():dic['k1'].append(i)else:dic['k1']=[i,]else:if"k2"indic.keys():dic['k2'].append(i)else:dic['k2']=[i,]print(dic)#输出如下{'k2':[11,22,33,44,55],'k1':[66,77,88,99]}namedtuplenamedtuple用于创建自定义元组object,并指定元组元素的数量,并且可以使用属性而不是索引来引用元组的元素。使用命名元组的步骤:#将元组封装为类,可以通过字段名(属性名)访问元组中的值#支持对元组的所有操作fromcollectionsimportnamedtuple#1,定义一个类Runsen=namedtuple('Runsen',['name','sex','age'])#2,创建对象runsen=Runsen("Runsen","帅哥",21)#3,获取命名元组的值print(runsen[1])#支持元组索引值打印(runsen[-2:])#支持分片打印(runsen.name)#支持按字段名取值#_fields,获取命名元组的所有属性名打印(runsen._fields)#_asdict方法,把元组转成字典'name','润森'),('sex','帅哥'),('age',21)])本文已收录GitHub,传送门~[1],里面有大厂访谈完整测试积分,欢迎Star。参考[1]传送门~:https://github.com/MaoliRUNsen/runsenlearnpy100