python 有很多的內(nèi)置模塊,collections是比較常用的一個,collections實現(xiàn)了專門的容器數(shù)據(jù)類型,為python的內(nèi)置容器提供了替代方案。(這句話是我根據(jù)官方文檔理解翻譯的。原文:This module implements specialized container datatypes providing alternatives to Python’s general purpose built-in containers, dict, list, set, and tuple.)我理解為在python常用的數(shù)據(jù)類型基礎(chǔ)上,提供了更高級的數(shù)據(jù)類型用法
collections中常用的類型有以下幾種(除了我介紹的還有其他的用法,有興趣的可以去官方文檔看一下,地址:https://docs.python.org/3/library/collections.html):
(1) namedtuple(): 可以創(chuàng)建一個類對象
(2) deque: 雙端隊列,可以在兩端操作
(3) counter: dict 的子類,具有統(tǒng)計功能
(4) OrderedDict: 有序字典
(5) defaultdict: dict的擴展子類,擁有dict的所有功能,還能在調(diào)用不存在的鍵時創(chuàng)建一個默認(rèn)值
其中最常用的是namedtuple() 和 defaultdict
一、namedtuple
1. namedtuple 繼承自tuple ,可以用來創(chuàng)建一個類對象
用法如下圖:
2. 為什么會用到這種方法來定義類,而不用常用的class 方法:
(1) 代碼簡潔
(2) 節(jié)省空間,少了用class 定義類的很多變量 (3) python解釋器在解釋class 類的時候會創(chuàng)建很多變量,使用namedtuple會省很多的中間變量,節(jié)省內(nèi)存,提高效率,尤其是在數(shù)據(jù)分析的時候用處很大
3. namedtuple繼承了tuple,所以也有拆包的功能,在創(chuàng)建類傳參時可以使用,用法如下:
4. 除了從tuple繼承的方法外,namedtuple還提供了3個方法和1個屬性,為了避免沖突,使用下劃線開頭。
(1) _make(iterable): 創(chuàng)建新的實例方法,參數(shù)必須是可迭代的
這里的user_tuple直接使用前面的
(2) _asdict(): 返回一個OrderdDict
(3) _replace(**kwargs): 會返回一個新的namedtuple 實例,并將指定字段的值替換,也就是修改字段值,但是不會修改原實例,會返回一個新實例。
(4) _fields: 返回所有字段,返回結(jié)果是tuple
二、deque 雙端隊列
1. 用法跟list 類似,比list 多了左側(cè)操作的方法
2. 相關(guān)操作
(1) appendleft()
(2) clear()
(3) conut()
(4) copy()
(5) extend()
extendleft()
(6) index()
(7) pop()
popleft()
(8) remove()
(9) reverse()
要注意,reversed是有返回值的,并不改變原值
(10) rotate():將元素向左或右移動,參數(shù)為1右移,-1 左移,默認(rèn)為1
(11) maxlen: deque的最大尺寸,如果返回None,表示沒有限制
這些用法跟list是一樣的,我就不演示了。
三、defaultdict
沒用defaultdict之前,如果我們要統(tǒng)計一個列表中每個元素出現(xiàn)的次數(shù),會怎么做呢?
一般我們都會想到下面這種方法:
如果對字典的用法了解的更深入的話,會想到下面這種方法:
這種方法相比第一種而言,不僅代碼行數(shù)少,而且速度更快,更高效
在我們了解了defaultdict 之后,有一種更簡單高效的用法:
這里參數(shù)還可以參數(shù)函數(shù),用法如下:
四、OrderedDict
python2 下,dict 無序的
OrderdDcit 有序
python3 下,都有序
這里的有序指的是添加順序
用法有以下幾種:
(1) 刪除,popitem() 移除并返回一個鍵值對(key, value),參數(shù)為last, 不傳參時刪除最后一個,傳參 last = True刪除第一個, last = False,刪除最后一個,默認(rèn)為False
(2) move_to_end(key, last=True)
last 為 True 時,元素移到末尾,為 False 時,移到首位,默認(rèn)為True
當(dāng) key 不存在時,會報 KeyError錯誤
五、Counter
Counter 是dict的子類,用于計數(shù)可哈希對象
可以理解為就是一個計數(shù)功能。
用法如下:
(1)
(2) 如果元素不存在,不會報KeyError的錯誤,會返回一個0值
(3) 如果你想把Counter中的對象移除,要用del 實現(xiàn)
如下,但是b中元素并不會受到影響
(4) elements
在元素上返回一個迭代器,重復(fù)次數(shù)跟計數(shù)相同,如果計數(shù)小于等于0會忽略,按任意順序返回
(5) most_common([n])
返回數(shù)量最多的前n個元素的列表,如果沒有傳入n,會默認(rèn)返回所有元素
(6) substract
從一個Counter中減去另一個Counter
Counter和defaultdict都有統(tǒng)計計數(shù)的功能,但時兩者有什么區(qū)別,我還沒有了解透徹,有明白的大佬,歡迎補充。
以上筆記是我根據(jù)官方文檔和慕課網(wǎng)的一個視頻教程整理出來的,如果有興趣的也可以自己去慕課網(wǎng)上看一下。
因為只是學(xué)習(xí)了一下collections模塊,并沒有在實際工作中使用,如果有錯誤的地方,還請指正,共同進步,謝謝!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
