两颗西柚 collections 这么好用,原来( 二 )


使用list作为default_factory
>>>s=[('yellow',1),('blue',2),('yellow',3),('blue',4),('red',1)]>>>d=collections.defaultdict(list)>>>fork,vins:...d[k].append(v)...>>>ddefaultdict(<class'list'>,{'yellow':[1,3],'blue':[2,4],'red':[1]})>>>d.itemsdict_items([('yellow',[1,3]),('blue',[2,4]),('red',[1])])>>>sorted(d.items)[('blue',[2,4]),('red',[1]),('yellow',[1,3])]
使用dict作为default_factory
>>>nums=collections.defaultdict(dict)>>>nums[1]={'one':1}>>>numsdefaultdict(<class'dict'>,{1:{'one':1}})>>>nums[2]{}>>>numsdefaultdict(<class'dict'>,{1:{'one':1},2:{}})
使用set作为default_factory
>>>types=collections.defaultdict(set)>>>types['手机'].add('华为')>>>types['手机'].add('小米')>>>types['显示器'].add('AOC')>>>typesdefaultdict(<class'set'>,{'手机':{'华为','小米'},'显示器':{'AOC'}})
OrderedDict
Python字典中的键的顺序是任意的 , 它们不受添加的顺序的控制 。
collections.OrderedDict类提供了保留他们添加顺序的字典对象 。
>>>o=collections.OrderedDict>>>o['k1']='v1'>>>o['k3']='v3'>>>o['k2']='v2'>>>oOrderedDict([('k1','v1'),('k3','v3'),('k2','v2')])
如果在已经存在的key上添加新的值 , 将会保留原来的key的位置 , 然后覆盖value值 。
>>>o['k1']=666>>>oOrderedDict([('k1',666),('k3','v3'),('k2','v2')])>>>dict(o){'k1':666,'k3':'v3','k2':'v2'}
namedtuple
三种定义命名元组的方法:第一个参数是命名元组的构造器(如下的:Person1 , Person2 , Person3)
>>>P1=collections.namedtuple('Person1',['name','age','height'])>>>P2=collections.namedtuple('Person2','name,age,height')>>>P3=collections.namedtuple('Person3','nameageheight')
实例化命名元组
>>>lucy=P1('lucy',23,180)>>>lucyPerson1(name='lucy',age=23,height=180)>>>jack=P2('jack',20,190)>>>jackPerson2(name='jack',age=20,height=190)>>>lucy.name#直接通过实例名.属性来调用'lucy'>>>lucy.age23
deque
collections.deque返回一个新的双向队列对象 , 从左到右初始化(用方法append()) , 从iterable(迭代对象)数据创建 。 如果iterable没有指定 , 新队列为空 。
collections.deque队列支持线程安全 , 对于从两端添加(append)或者弹出(pop) , 复杂度O(1) 。
【两颗西柚 collections 这么好用,原来】虽然list对象也支持类似操作 , 但是这里优化了定长操作(pop(0)、insert(0,v))的开销 。
如果maxlen没有指定或者是None , deque可以增长到任意长度 。 否则 , deque就限定到指定最大长度 。 一旦限定长度的deque满了 , 当新项加入时 , 同样数量的项就从另一端弹出 。
支持的方法:
append(x):添加x到右端 。
appendleft(x):添加x到左端 。
clear:清除所有元素 , 长度变为0 。
copy:创建一份浅拷贝 。
count(x):计算队列中个数等于x的元素 。
extend(iterable):在队列右侧添加iterable中的元素 。
extendleft(iterable):在队列左侧添加iterable中的元素 , 注:在左侧添加时 , iterable参数的顺序将会反过来添加 。