python 有很多的内置子產品,collections是比較常用的一個,collections實作了專門的容器資料類型,為python的内置容器提供了替代方案。(這句話是我根據官方文檔了解翻譯的。原文:This module implements specialized container datatypes providing alternatives to Python’s general purpose built-in containers, dict, list, set, and tuple.)我了解為在python常用的資料類型基礎上,提供了更進階的資料類型用法
collections中常用的類型有以下幾種(除了我介紹的還有其他的用法,有興趣的可以去官方文檔看一下,位址:https://docs.python.org/3/library/collections.html):
(1) namedtuple(): 可以建立一個類對象
(2) deque: 雙端隊列,可以在兩端操作
(3) counter: dict 的子類,具有統計功能
(4) OrderedDict: 有序字典
(5) defaultdict: dict的擴充子類,擁有dict的所有功能,還能在調用不存在的鍵時建立一個預設值
其中最常用的是namedtuple() 和 defaultdict
一、namedtuple
1. namedtuple 繼承自tuple ,可以用來建立一個類對象
用法如下圖:

2. 為什麼會用到這種方法來定義類,而不用常用的class 方法:
(1) 代碼簡潔
(2) 節省空間,少了用class 定義類的很多變量 (3) python解釋器在解釋class 類的時候會建立很多變量,使用namedtuple會省很多的中間變量,節省記憶體,提高效率,尤其是在資料分析的時候用處很大
3. namedtuple繼承了tuple,是以也有拆包的功能,在建立類傳參時可以使用,用法如下:
4. 除了從tuple繼承的方法外,namedtuple還提供了3個方法和1個屬性,為了避免沖突,使用下劃線開頭。
(1) _make(iterable): 建立新的執行個體方法,參數必須是可疊代的
這裡的user_tuple直接使用前面的
(2) _asdict(): 傳回一個OrderdDict
(3) _replace(**kwargs): 會傳回一個新的namedtuple 執行個體,并将指定字段的值替換,也就是修改字段值,但是不會修改原執行個體,會傳回一個新執行個體。
(4) _fields: 傳回所有字段,傳回結果是tuple
二、deque 雙端隊列
1. 用法跟list 類似,比list 多了左側操作的方法
2. 相關操作
(1) appendleft()
(2) clear()
(3) conut()
(4) copy()
(5) extend()
extendleft()
(6) index()
(7) pop()
popleft()
(8) remove()
(9) reverse()
要注意,reversed是有傳回值的,并不改變原值
(10) rotate():将元素向左或右移動,參數為1右移,-1 左移,預設為1
(11) maxlen: deque的最大尺寸,如果傳回None,表示沒有限制
這些用法跟list是一樣的,我就不示範了。
三、defaultdict
沒用defaultdict之前,如果我們要統計一個清單中每個元素出現的次數,會怎麼做呢?
一般我們都會想到下面這種方法:
如果對字典的用法了解的更深入的話,會想到下面這種方法:
這種方法相比第一種而言,不僅代碼行數少,而且速度更快,更高效
在我們了解了defaultdict 之後,有一種更簡單高效的用法:
這裡參數還可以參數函數,用法如下:
四、OrderedDict
python2 下,dict 無序的
OrderdDcit 有序
python3 下,都有序
這裡的有序指的是添加順序
用法有以下幾種:
(1) 删除,popitem() 移除并傳回一個鍵值對(key, value),參數為last, 不傳參時删除最後一個,傳參 last = True删除第一個, last = False,删除最後一個,預設為False
(2) move_to_end(key, last=True)
last 為 True 時,元素移到末尾,為 False 時,移到首位,預設為True
當 key 不存在時,會報 KeyError錯誤
五、Counter
Counter 是dict的子類,用于計數可哈希對象
可以了解為就是一個計數功能。
用法如下:
(1)
(2) 如果元素不存在,不會報KeyError的錯誤,會傳回一個0值
(3) 如果你想把Counter中的對象移除,要用del 實作
如下,但是b中元素并不會受到影響
(4) elements
在元素上傳回一個疊代器,重複次數跟計數相同,如果計數小于等于0會忽略,按任意順序傳回
(5) most_common([n])
傳回數量最多的前n個元素的清單,如果沒有傳入n,會預設傳回所有元素
(6) substract
從一個Counter中減去另一個Counter
Counter和defaultdict都有統計計數的功能,但時兩者有什麼差別,我還沒有了解透徹,有明白的大佬,歡迎補充。
以上筆記是我根據官方文檔和慕課網的一個視訊教程整理出來的,如果有興趣的也可以自己去慕課網上看一下。
因為隻是學習了一下collections子產品,并沒有在實際工作中使用,如果有錯誤的地方,還請指正,共同進步,謝謝!