collections模組在內建資料型別(dict、list、set、tuple)的基礎上,還提供了幾個額外的資料型別:ChainMap、Counter、deque、defaultdict、namedtuple和OrderedDict等。
-
namedtuple:生成可以使用名字來訪問元素內容的tuple子類
-
deque:雙端佇列,可以快速的從另外一側追加和推出物件
-
Counter:計數器,主要用於計數
-
OrderedDict:有序字典
-
defaultdict:帶有預設值的字典
namedtuple
我們知道tuple可以表示不變集合,例如,一個點的二維座標就可以表示成:p=(1,2)
但是,看到(1,2),很難看出這個tuple是用來表示座標的。
那麼,我們的namedtuple就能用上了。
namedtuple(`名稱`,‘屬性list’)
from collections import namedtuple Point = namedtuple(`Point`,[`x`,`y`]) p = Point(1,2) print(p.x) # 1 print(p.y) # 2
可以驗證建立的Point物件是tuple的一種子類:
print(isinstance(p,Point)) # True print(isinstance(p,tuple)) # True
deque
使用list儲存資料時,按索引訪問元素很快,但是插入和刪除元素就很慢了,因為list是線性儲存,資料量大的時候,插入和刪除效率很低。deque為了高效實現插入和刪除操作的雙向列表,適合用於佇列和棧。
from collections import deque q = deque([`a`,`b`,`c`,`d`]) q.append(`e`) q.appendleft(`A`) print(q) # deque([`A`, `a`, `b`, `c`, `d`, `e`]) q.pop() q.popleft() print(q) # deque([`a`, `b`, `c`, `d`])
defaultdict
使用dict時,如果引用的Key不存在,就會丟擲異常。如果希望key不存在時,返回一個預設值,就可以使用defaultdict。
from collections import defaultdict d = defaultdict(lambda:`N/A`) d[`key1`] = `abc` print(d[`key1`]) # abc print(d[`key2`]) # N/A
注意預設值是呼叫函式返回的,而函式在建立defaultdict物件是傳入。
除了在key不存在時返回預設值,defaultdict的其他行為跟dict是完全一樣的。
OrderDict
使用字典時,key是無序的。在對字典做迭代時,我們無法確定key的順序。如果要保持key的順序,可以用OrderedDict
from collections import OrderedDict d = dict([(`a`,1),(`b`,2),(`c`,3)]) print(d) # {`a`: 1, `c`: 3,`b`: 2} dict的key是無序的 od = OrderedDict([(`a`,1),(`b`,2),(`c`,3)]) print(od) # OrderedDict([(`a`, 1), (`b`, 2), (`c`, 3)]) OrderedDict的key是有序的
注意,OrderedDict
的Key會按照插入的順序排列,不是Key本身排序:
from collections import OrderedDict od = OrderedDict() od[`z`] = 1 od[`y`] = 2 od[`x`] = 3 print(od.keys()) # odict_keys([`z`, `y`, `x`])
Counter
Counter類的目的是用來跟蹤值出現的次數。它是一個無序的容器型別,以字典的鍵值對形式儲存,其中元素作為key,其計數作為value。計數值可以是任意的Interger(包括0和負數)。
from collections import Counter c = Counter() for i in `asdsadsafjzjk`: c[i]+=1 print(c) # Counter({`a`: 3, `s`: 3, `d`: 2, `j`: 2, `f`: 1, `z`: 1, `k`: 1}) cc = Counter(`asdsadsafjzjk`) print(cc) # Counter({`a`: 3, `s`: 3, `d`: 2, `j`: 2, `f`: 1, `z`: 1, `k`: 1})