python—collections模組(defaultdict、Counter、OrderedDict)

codeDRT發表於2020-11-17

1.defaultdict

現在假設這樣一種情況,有一組列表字串。我們需要統計每個字串出現的次數,並以鍵值對的形式儲存起來。下面先來演示一個錯誤的寫法。

a = ['a','b','r','a','d','r']
b = {}
for i in a:
    b[i] += 1
print(b)
Traceback (most recent call last):
  File "D:/Spider_base/test.py", line 5, in <module>
    b[i] += 1
KeyError: 'a'

報錯的原因是,字典對於不存在key直接取值的話,會顯示KeyError。如果不想報錯,我們就需要加上一個判斷,對於不存在的key,我們就加上,並賦予初值為1。如下:

a = ['a','b','r','a','d','r']
b = {}
for i in a:
    if i in b.keys():
        b[i] += 1
    else:
        b[i] = 1
print(b)
{'a': 2, 'b': 1, 'r': 2, 'd': 1}

對於上述程式碼,我們還可以進行優化,即使用字典的setdefault來代替if語句。對於不存在的key賦予預設值0,存在的key就不做任何操作。

a = ['a','b','r','a','d','r']
b = {}
for i in a:
   b.setdefault(i,0)
   b[i] += 1
print(b)
{'a': 2, 'b': 1, 'r': 2, 'd': 1}

問題來了,我們還可以再優化嗎?上一次優化雖然去除了if語句,但對於每一個key,我們都需要進行判斷是否需要給一個預設值。
答案是可以再次優化,python提供了一種預設值字典的資料結構。它允許我們在定義字典時給所有不存在的key設定預設值,這樣當取不存在的key時,就不會報錯。

from collections import defaultdict
a = ['a','b','r','a','d','r']
b = defaultdict(int)
for i in a:
   b[i] += 1
print(b)
defaultdict(<class 'int'>, {'a': 2, 'b': 1, 'r': 2, 'd': 1})

defaultdict字典相當於是普通欄位的強化版,繼承原始dict的功能,並賦予了它新的特性。

初始化defaultdict的引數是一個可呼叫物件,即函式名。int函式就相當於函式如下:

def fun():
   return 0

也可以使用匿名函式如下:

b = defaultdict(lambda :0)

也可以使用:list對應[ ],str對應的是空字串,set對應set( ),int對應0

2.OrderedDict

使用dict時,Key是無序的。在對dict做迭代時,我們無法確定Key的順序。如果要保持Key的順序,可以用OrderedDict。

from collections import OrderedDict
 
a = OrderedDict()
print(a.fromkeys(['a','b','d','c'],'qq'))
OrderedDict([('a', 'qq'), ('b', 'qq'), ('d', 'qq'), ('c', 'qq')])

OrderedDict的Key會按照插入的順序排列,不是Key本身排序。

3.Counter

Counter類的目的是用來跟蹤值出現的次數。它是一個無序的容器型別,以字典的鍵值對形式儲存,其中元素作為key,其計數作為value。計數值可以是任意的Interger(包括0和負數)。

1.建立:

from collections import Counter
 
a = Counter()
b = Counter('afdasfdasd')
c = Counter({'a':4,'b':7})
d = Counter(a=4,b=7)
 
print(a,b,c,d)
Counter() Counter({'a': 3, 'd': 3, 'f': 2, 's': 2}) Counter({'b': 7, 'a': 4}) Counter({'b': 7, 'a': 4})

建立的方式有三種,第一種是空的Counter類,第二種傳入一個可迭代物件,可以是str、list、tuple、dict,最後一種是以鍵值對的形式。

2.訪問:

因為最後的計數結果是一個字典的樣式,故訪問通過訪問字典的方式,但若查詢的key不存在將會報錯。

3.most_common([n]):

該函式是將計數結果以列表巢狀二元元組的形式返回。引數n表示給最多n個元素計數,且計數量大的優先,預設返回所有計數。

from collections import Counter
 
b = Counter('afdasfdasd')
print(b)
print(b.most_common())
print(b.most_common(2))
Counter({'a': 3, 'd': 3, 'f': 2, 's': 2})
[('a', 3), ('d', 3), ('f', 2), ('s', 2)]
[('a', 3), ('d', 3)]

相關文章