在內置數據類型(dict、list、set、tuple)的基礎上,collections模塊還提供了幾個額外的數據類型:Counter、deque、defaultdict、namedtuple和OrderedDict等。python
1.namedtuple: 生成能夠使用名字來訪問元素內容的tupleapp
2.deque: 雙端隊列,能夠快速的從另一側追加和推出對象ide
3.Counter: 計數器,主要用來計數 函數
4.OrderedDict: 有序字典 spa
5.defaultdict: 帶有默認值的字典3d
帶有名稱的元組,namedtuple(名稱,[屬性集])
code
import collections #1.collections.namedtuple('名稱', 屬性集),屬性集,能夠是列表,元組,集合等, # 可是,集合是無序的,p.x,p.y,p.z值每次都是變化的,故不用 # point=collections.namedtuple('point',{'x','y','z'}) point=collections.namedtuple('point',['x','y','z']) p=point(1,2,3) print(p.x,p.y,p.z)
import queue #2.queue隊列FIFO q=queue.Queue(3) #定義隊列大小,即maxsize=3 def __init__(self, maxsize=0): print("q.maxsize=%d"%(q.maxsize)) q.put(5,) #放入數據 def put(self, item, block=True, timeout=None): q.put(4,False)#能夠設置不阻賽,若是隊列滿了,直接產生raise Full錯誤 q.put(3) print("隊列中現有元素個數:",q.qsize())#q.qsize(),返回隊列中現有元素個數,3 print(q.get(),q.get())#取出元素,先進來的2個數被取出,5和4 print("隊列中現有元素個數:",q.qsize())#q.qsize(),返回隊列中現有元素個數,1 q.put(['a','b','c',7])#列表算1個元素 q.put((4,5)) print('隊列中現有元素個數:%s--隊列已滿嗎?'%(q.qsize()))#阻塞後,執行不到這條語句 q.put(2,True,1) #若是隊列滿了,默認會阻塞(block=True),能夠定義阻塞時間(timeout=1),超時後會raise Full錯誤 #若是block=True,timeout不設置,則會一直處於阻塞中,以後的語句不會執行 print('隊列中現有元素個數:%s--隊列已滿嗎?'%(q.qsize()))#阻塞後,執行不到這條語句
import queue #2.queue隊列FIFO q=queue.Queue(3) #定義隊列大小,即maxsize=3 def __init__(self, maxsize=0): print("q.maxsize=%d"%(q.maxsize)) q.put(5,) #放入數據 def put(self, item, block=True, timeout=None): q.put(4,False)#能夠設置不阻賽,若是隊列滿了,直接產生raise Full錯誤 q.put(3) print("隊列中元素個數:",q.qsize())#q.qsize(),返回隊列中現有元素個數 q.put(2,True,1) #若是隊列滿了,默認會阻塞(block=True),能夠定義阻塞時間(timeout=1),超時後會raise Full錯誤 #若是block=True,timeout不設置,則會一直處於阻塞中,以後的語句不會執行 print('隊列已滿嗎?')#阻塞後,執行不到
使用list存儲數據時,按索引訪問元素很快,可是插入和刪除元素就很慢了,由於list是線性存儲,數據量大的時候,插入和刪除效率很低。對象
deque是爲了高效實現插入和刪除操做的雙向列表,適合用於隊列和棧blog
dq=collections.deque(['a','b','c'],2) #建立一個雙端對隊對象,def __init__(self, iterable=(), maxlen=None) print(dq) #返回deque(['b', 'c'], maxlen=2),進隊1-->2-->3順序,數據長度爲2,由於對列先進先出特色,故將'a'溢出 dq.clear()#清空隊列內容,但對列長度不被清空,仍爲2 print('dq.maxlen=',dq.maxlen)#dq.maxlen= 2,用於定義的時候使用,不能被寫入,形如a.maxlen=10會報錯 dp=collections.deque([1,2,3]) dp.append('a')#同list的append,在隊尾加入一個元素 dp.appendleft('b')#在隊首加入一個元素 dp.insert(2,['a','c'])#在索引2前面插入一個元數,即該數索引爲2 print(dp)#deque(['b', 1, ['a', 'c'], 2, 3, 'a']) print(dp.count('a'))#計數,返回:1,指定的是一級索下的元素,故列表中'a'不被統計, print(dp[2][0])#返回二級索引中元素'a',即列表中'a' dp.extend('2bc2f')#參數是一個可迭代變量,在對隊尾端按照迭代順序添加 print(dp)#deque(['b', 1, ['a', 'c'], 2, 3, 'a', '2', 'b', 'c', '2', 'f']), print(dp.pop())#彈出對列尾部一個元素:f print(dp.popleft())#彈出對列頭部一個元素:b print(dp) res1=dp.remove('2')#同list:用於移除列表中某個值的第一個匹配項. print('res1=%s-->dp=%s'%(res1,dp))#res1=None-->dp=deque([1, ['a', 'c'], 2, 3, 'a', 'b', 'c', '2']) # res1=dp.remove('9')#若是該值不在,則報錯 dp.rotate(2)#循環移動,爲正全體右移,爲負全體左移 print(dp)#deque(['c', '2', 1, ['a', 'c'], 2, 3, 'a', 'b'])
使用dict時,Key是無序的。在對dict作迭代時,咱們沒法肯定Key的順序。排序
若是要保持Key的順序,能夠用OrderedDict
:
dd={'z':1,'y':5,'x':False,'d':2,'a':3} od=collections.OrderedDict(b=1,a=2,c=3)#產生有序字典,但不那建議這樣作 od['z']='4' #這種作法比較好 od['y']='5' od['x']=True print(sorted(dd.items(),key=lambda item:item[0]))#按key排序 print(od)#OrderedDict([('b', 1), ('a', 2), ('c', 3), ('z', '4'), ('y', '5'), ('x', True)])
object(),type(),classmethod(),staticmethod(),super(),property(),file()
dd=collections.defaultdict(tuple)#產生個默認值:int(),即0,如果list,則[],tuple是()
print(dd['k'],int(),dd)#則不會報錯, 返回:() 0 defaultdict(<class 'tuple'>, {'k': ()})
d2=collections.defaultdict(lambda :5)#參數必需是callable,故能夠用函數,直接返回一個值
print(d2['k']) #返回5