collections模組

F.or,T發表於2018-12-10

  collections模組在內建資料型別(dict、list、set、tuple)的基礎上,還提供了幾個額外的資料型別:ChainMap、Counter、deque、defaultdict、namedtuple和OrderedDict等。

  1. namedtuple:生成可以使用名字來訪問元素內容的tuple子類

  2. deque:雙端佇列,可以快速的從另外一側追加和推出物件

  3. Counter:計數器,主要用於計數

  4. OrderedDict:有序字典

  5. 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})

 

相關文章