collections模塊基於Python中內置的dict、list、set和tuple數據類型實現了一些專門的容器,來擴展這些基礎類型變量的功能。app
namedtuple函數
原始的tuple只能經過index的方式訪問所包含的元素,namedtuple就至關於爲tuple和tuple中的元素取了新的名字,操做的時候能夠用這些名字直接去訪問(這種操做好像跟C裏面的struct差很少耶)。這種設置可讓咱們定義tuple變量的目的一目瞭然,因此用好它可讓咱們的代碼更易於維護。下面來看看具體怎麼用吧!ui
# 如今咱們想要定義一個類型專門用於保存座標 # 構造一個類專門去保存好像有點麻煩 # 這時namedtuple就派上用場啦 # 執行結果在下方 from collections import namedtuple Posi = namedtuple('Positions', ('x', 'y')) p = Posi(1, 2) # 建立對象時記住要用Posi,Positions只是一個標識的名稱 print(p) # Positions(x=1, y=2) print(p.x, p.y) # 記住tuple是不可修改的,因此不能給p.x從新賦值 # 1 2
沒錯,實例化的對象打印出來的就是咱們前面給它定義的名字,元素名稱也能夠用咱們給的名字來得到。比起老式的tuple,namedtuple簡直是太貼心,一眼就能看出來做用了。code
deque對象
deque是一個對list進行功能擴展的方法,說白了就是把list改爲了一個雙端隊列,可用於棧和隊列。雖然list對象也支持相似的操做,可是因爲線性存儲插入和刪除元素的時間複雜度是O(n),當數據量很大時效率很低。deque裏面有許多操做方法:排序
from collections import deque que1 = deque([1,2,3,4,5]) que1.append(5) # 向右添加元素 print(que1) # deque([1, 2, 3, 4, 5, 5]) que1.appendleft(0) # 向左添加元素 print(que1) # deque([0, 1, 2, 3, 4, 5, 5]) que2 = que1.copy() # 淺拷貝一個deque對象 print(que1,que2) # deque([0, 1, 2, 3, 4, 5, 5]) deque([0, 1, 2, 3, 4, 5, 5]) que1.clear() # 清空deque中元素 print(que1) #deque([]) print(que2.count(5)) # 統計某一個元素的個數 # 2 que2.extend([6,7]) # 從右合併 que2.extendleft([-1,-2]) # 往左擴展時是倒序合併 print(que2) # deque([-2, -1, 0, 1, 2, 3, 4, 5, 5, 6, 7]) que2.insert(4,1) # 向指定位置插入元素,前一個參數爲位置,後一個爲值 print(que2) # deque([-2, -1, 0, 1, 1, 2, 3, 4, 5, 5, 6, 7]) que2.pop() # 右彈出值 que2.popleft() # 坐彈出值 print(que2) # deque([-1, 0, 1, 1, 2, 3, 4, 5, 5, 6]) que2.remove(1) # 刪除第一個找到的值 print(que2) # deque([-1, 0, 1, 2, 3, 4, 5, 5, 6]) que2.reverse() print(que2) # 將deque對象中的元素倒排 # deque([6, 5, 5, 4, 3, 2, 1, 0, -1]) que2.rotate(2) # 將右邊的N個元素彈出並插入到左邊 print(que2) # deque([0, -1, 6, 5, 5, 4, 3, 2, 1])
ChainMap繼承
ChainMap提供了一種能夠將多個映射做爲一個單元處理的策略。它每每比建立一個新字典而後用update()將原字典合併來的快得多。須要注意的是ChainMap是經過引用的方式來合併全部映射對象中的元素,因此當原映射對象中的元素改變時,合併後對象中的內容也會改變。隊列
from collections import ChainMap attr1 = {'name':'Tom','Age':18} attr2 = {'gender':'man','addr':'Beijing'} people = ChainMap(attr1,attr2) # 合併兩個字典 print(people) # ChainMap({'name': 'Tom', 'Age': 18}, {'addr': 'Beijing', 'gender': 'man'}) print(people['name']) # Tom attr1['name'] = 'Micheal' print(attr1['name'], people['name']) # 修改原字典中的值,合併後列表中的值也會改變 # Micheal Micheal people = people.new_child({'country':'America'}) # new_child爲ChainMap實例合併新字典 print(people) # ChainMap({'country': 'America'}, {'name': 'Micheal', 'Age': 18}, {'addr': 'Beijing', 'gender': 'man'}) print(people.parents) # parents屬性指定的是父級內容,即實例變化前的內容 # ChainMap({'name': 'Micheal', 'Age': 18}, {'addr': 'Beijing', 'gender': 'man'}) print(people.parents.parents) # 父級的父級內容 #ChainMap({'addr': 'Beijing', 'gender': 'man'}) print(people.maps) # maps屬性返回的是將合併後的ChainMap實例拆分並保存爲list的結果,是最新的結果 # [{'country': 'America'}, {'name': 'Micheal', 'Age': 18}, {'addr': 'Beijing', 'gender': 'man'}] print(people) # ChainMap({'country': 'America'}, {'name': 'Micheal', 'Age': 18}, {'addr': 'Beijing', 'gender': 'man'})
counterelement
counter提供的是一個方便又快速的計數器,統計出來的計數是用字典保存的,字段保存爲key,出現次數保存爲value。Counter能夠讀取任何字段的計數,不存在的字段默認計數爲0,value值也能夠爲負。使用方法以下:rem
from collections import Counter c1 = Counter('hello world') print(c1) # Counter({'l': 3, 'o': 2, ' ': 1, 'e': 1, 'w': 1, 'h': 1, 'd': 1, 'r': 1}) c2 = Counter({'man':4, 'woman':2}) print(c2) # Counter({'man': 4, 'woman': 2}) c3 = Counter(child=3, young=1,old=2) print(c3.most_common(2)) # most_common方法會返回計數排名前N的元素 # [('child', 3), ('old', 2)] print(list(c3.elements())) # elements方法返回一個迭代器,裏面包含全部的key,數量與計數對應 # ['young', 'old', 'old', 'child', 'child', 'child'] c4 = Counter(child=2,young=1,old=1) c3.subtract(c4) # subtract方法用於從一個counter中減掉另外一個counter,key相同時對計數作減法 print(c3) # Counter({'old': 1, 'child': 1, 'young': 0}) c5 = Counter(middle=3) c4.subtract(c5) print(c4) # Counter({'child': 2, 'young': 1, 'old': 1, 'middle': -3}) del c3['child'] # del用於從字典中刪除某一個元素,這類操做一樣適用於Counter實例 print(c3['child']) # 0 fruits1 = Counter({'apple':3,'orange':5,'banana':7}) fruits2 = Counter({'orange':2,'apple':1,'pear':4}) print(fruits1 - fruits2) # Counter實例還可進行加減運算和按位與或 # Counter({'banana': 7, 'orange': 3, 'apple': 2}) print(fruits1 + fruits2) # Counter({'banana': 7, 'orange': 7, 'pear': 4, 'apple': 4}) print(fruits1 & fruits2) # Counter({'orange': 2, 'apple': 1}) print(fruits1 | fruits2) # Counter({'banana': 7, 'orange': 5, 'pear': 4, 'apple': 3})
還須要注意的是,一些對字典的常規操做一樣對Counter也有效。可是fromkeys()在這裏不能做用於Counter實例,update()在這裏是新增Counter而不是代替舊的Counter,這兩種方法是例外。
OrderDict
常規的dict是隨機存儲的,這就致使了咱們對dict進行迭代的時候沒法確元素的順序。OrderDict可以有效的解決這個問題,可是返回的是插入時的順序,而不是根據key來排序(若是一開始就定義了元素,輸出時是隨機順序輸出的)。
from collections import OrderedDict d = OrderedDict(a=1,b=2,c=3) print(d) # OrderedDict([('c', 3), ('a', 1), ('b', 2)]) print(d) # OrderedDict([('c', 3), ('a', 1), ('b', 2)]) d['d'] = 4 print(d) # OrderedDict([('c', 3), ('a', 1), ('b', 2), ('d', 4)]) print(d) # 元素按照固定順序排列 # OrderedDict([('c', 3), ('a', 1), ('b', 2), ('d', 4)]) d = OrderedDict.fromkeys('abbcde') print(d) # rderedDict([('a', None), ('b', None), ('c', None), ('d', None), ('e', None)]) d.move_to_end('b') # 將指定元素移動到末尾 print(d.keys()) # odict_keys(['a', 'c', 'd', 'e', 'b']) d.move_to_end('d',last=False) # 將指定元素移動到頭部 print(d.keys()) # odict_keys(['d', 'a', 'c', 'e', 'b']) d.popitem() # 移除末尾元素 print(d.keys()) # odict_keys(['d', 'a', 'c', 'e']) d.popitem(last=False) # 移除首部元素 print(d.keys()) # dict_keys(['a', 'c', 'e'])
defaultdict
通常的dict,若是試圖訪不存在的Key則會拋出KeyError錯誤。若是但願Key不存在的時候返回一個默認的value值,那麼defaultdict就派上用場了。(注意默認值是經過調用函數來帶回值)
from collections import defaultdict dd = defaultdict(lambda : 0) dd['a'] = 1 print(dd['a']) # 1 print(dd['b']) # 0
UserDict
用戶自定義字典類,能夠繼承該類並重寫規則。初始化時能夠用來拷貝一個字典的數據,而不是簡單的引用。
from collections import UserDict dict = {'a':1,'b':2} ud = UserDict(dict) print(dict, ud) # {'b': 2, 'a': 1} {'b': 2, 'a': 1} ud['c'] = 3 print(dict, ud) # {'b': 2, 'a': 1} {'c': 3, 'b': 2, 'a': 1}
UserList
用戶自定義列表類,能夠繼承該類並重寫規則。構建一個用戶自定義列表,初始化時能夠拷貝另一個列表中的內容。
from collections import UserList li = [1,2,3,4] l = li ul = UserList(li) del li[0] print(l, li, ul) # [2, 3, 4] [2, 3, 4] [1, 2, 3, 4]
UserString
用戶自定義字符串類,能夠繼承該類並重寫規則。初始化時能夠拷貝一個字符串。
from collections import UserString s = 'hello world!' us = UserString(s) print(s, us) # hello world! hello world!
轉載請註明出處,若有不正之處還望矯正,謝謝