python-30 collections相關 模塊

在內置數據類型(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

帶有名稱的元組,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)
View Code

queue:隊列

queue模塊有三種隊列及構造函數:

  1. Python queue模塊的FIFO隊列先進先出。 class queue.Queue(maxsize)
  2. LIFO相似於堆,即先進後出。 class queue.LifoQueue(maxsize)
  3. 還有一種是優先級隊列級別越低越先出來。 class queue.PriorityQueue(maxsize)

queue模塊中的經常使用方法:

  • queue.qsize() 返回隊列的大小
  • queue.empty() 若是隊列爲空,返回True,反之False
  • queue.full() 若是隊列滿了,返回True,反之False
  • queue.full 與 maxsize 大小對應
  • queue.get([block[, timeout]])獲取隊列,timeout等待時間  ,
    1. 若是無數據可取,默認會阻塞(block=True),阻塞時能夠定義超時時間(timeout=2)
    2. 能夠使用block=False設置不阻塞當即報錯
  • queue.get_nowait() 至關queue.get(False)
  • queue.put(item) 寫入隊列,timeout等待時間
  • queue.put_nowait(item) 至關queue.put(item, False)
  • queue.task_done() 在完成一項工做以後,queue.task_done()函數向任務已經完成的隊列發送一個信號
  • queue.join() 實際上意味着等到隊列爲空,再執行別的操做
  • 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()))#阻塞後,執行不到這條語句
    View Code

     

  • 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('隊列已滿嗎?')#阻塞後,執行不到
  • deque:雙端對隊

    使用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'])
    View Code
  • OrderedDict:有序字典

    使用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)])
    View Code

    defaultdict:默認字典      def __init__(self, default_factory=None, **kwargs):

  • 其實defaultdict 就是一個字典,只不過python自動的爲它的鍵賦了一個初始值。這也就是說,你不顯示的爲字典的鍵賦初值python不會報錯,看下實際例子。
  • default_factory:參數是一個工廠函數,且是可callable
  • 工廠函數:統一了類型和類,即他們看上去有點象函數, 實質上他們是類。當你調用它們時, 其實是生成了該類型的一個實例, 就象工廠生產貨物同樣。
  • 全部的內建函數都是工廠函數,如 : int(), long(), float(), complex(),bool() ,str(), list(), tuple(),dict(),set(),frozenset()

     object(),type(),classmethod(),staticmethod(),super(),property(),file()

  • python會拋出一個KeyError 異常,由於字典索引以前必須初始化,能夠用defaultdict來解決
  •  
    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
相關文章
相關標籤/搜索