collections库是标准库的一部分。里面有很多数据结构,在列表、字典、元组的基础上做了很多修改和改进。今天就来说说最有用的吧。1.deque实现了一个两端都可以操作的队列,相当于双端队列,可以指定最多可以存放多少个元素,这和Python的基本数据类型列表很相似。fromcollectionsimportdequea=deque(maxlen=3)上面的代码定义了一个大小为3的双端队列,当你插入第4个元素时,队列的第一个元素将被删除。a=deque(maxlen=3)a.append(1)#a=[1]a.append(2)#a=[1,2]a.append(3)#a=[1,2,3]FULLa.append(4)#a=[2,3,4]因为这是一个双端队列,可以在队头插入元素,也可以在首尾删除元素,它们的时间复杂度为O(1):append(x)在队尾插入xappendleft(x)在队头插入xpop()删除队尾的元素并返回popleft()删除队尾的元素队列的头部并返回a=deque(maxlen=10)a.append(1)#a=[1]a.append(2)#a=[1,2]Insert2a.appendleft(3)#a=[3,1,2]在队尾插入3x=a.pop()#a=[3,1]在队头,x=2删除队尾2y的元素=a.popleft()#a=[1],y=3删除队列头部的元素32.namedtuple库提供命名元组,可以通过指定名称访问,例如:fromcollectionsimportnamedtuplePoint=namedtuple("点",['x','y','z'])p=Point(3,4,5)print(p.x,p.y,p.z)#Output:3,4,5namedtuple该函数将第一个参数作为新元组的名称,第二个参数为元组中元素的名称映射,可以是字符字符串列表,也可以是空格或逗号分隔的字符串.Point=namedtuple("Point","xyz")Point=namedtuple("Point","x,y,z")也可以这样初始化,很灵活:p1=Point(3,4,5)p2=Point(x=3,y=4,z=5)p3=Point._make([3,4,5])也可以使用namedtuple设置默认值:PointDef=namedtuple("PointDef","x,y,z",defaults=[0,0,0])p=PointDef(x=1)#pis(1,0,0)如果定义三个名称但提供两个默认值,则只有最后两个是赋默认值:Point=namedtuple("Point","xyz",defaults="[0,0])print(Point._field_defaults)#output:{"y":0,"z":0}3、CounterCounterCounter非常有用,尤其是当你需要统计列表或可迭代对象中元素的数量时:fromcollectionsimportCounterc=Counter("aaabbccdaaa")print(c)#Output:Counter({'a':6,'b':2,'c':2,'d':1})统计出现频率最高的前几个也很方便,比如统计出现频率最高的两个元素:print(c.most_common(2))#output:[('a',6),('b',2)]也可以动态增删字符串,然后计数:c=Counter("abbc")#{"a":1,"b":2,"c":1}c.update("bccd")#{"a":1,"b":3,"c":3"d":1}c.subtract("bbc")#{"a":1,"b":1,"c":2,"d":1}4、defaultdictdefaultdict类似于dict,但是可以提供dict的取值的默认数据类型,例如:fromcollectionsimportdefaultdicttoAdd=[(“key1”,3),(“key2”,5),(“key3”,6),(“key2”,7)]d=defaultdict(list)forkey,valintoAdd:d[key].append(val)print(d)#{"key1":[3],"key2":[5,7],"key3":[6]}如果你使用dict,你可能想这样写:d=dict()forkey,valintoAdd:ifkeyind:d[key].append(val)else:d[key]=[val]或类似这样的东西:d=dict()forkey,valintoAdd:d.setdefault(key,[])。append(val)总之defaultdict简单快速的
