[python][collections] Counter 計數器

在作文本統計分析的時候,咱們常常會須要進行「計數」這樣一個環節。而若是直接使用字典,代碼不免會變得複雜。其實, collections 模塊中早就給咱們定義好了 Counter 類,它能夠很方便地實現計數的功能。python

1. 建立一個 Counter 對象

只須要使用 Counter() 就能夠建立一個 Counter 對象了,其中的參數能夠有許多種寫法:編程

  • 列表 Counter(['apple', 'boy', 'apple'])app

  • 字典 Counter({'apple':2, 'boy':1})編程語言

  • 字符串(每個字符視爲一個元素) Counter('aabca')code

  • 關鍵字形式 Counter(apple=2, boy=1)對象

接下來以一個小例子對比一下使用普通的字典與 Counter 統計詞頻的區別。在統計以前,咱們先對文本進行一些處理:字符串

s = 'A boy and a girl'
s = s.lower().split()

切分完文本以後,咱們先展現使用普通的字典進行詞頻統計的方法:it

d = {}

for word in s:
    if word in d:
        d[word] += 1;
    else:
        d[word] = 1;

print(d)
{'a': 2, 'boy': 1, 'and': 1, 'girl': 1}

雖然 python 的語法已經比其餘編程語言簡單很多,可是這樣的結構看起來仍是有些繁瑣。而若是使用 Counter 對象的話,咱們只須要用一行語句就能夠完成:io

c = Counter(s)
print(c)
Counter({'a': 2, 'boy': 1, 'and': 1, 'girl': 1})

可見, Counter 的確可以簡化咱們對計數的操做。不過除了可以在一開始的統計上簡化代碼外,它還有許多方便的方法可使用。class

2. 獲取對應鍵的值

Counter 獲取值的方法與字典相似,只須要用 [key] 就能夠獲取對應的值。不過它與原先的字典不同的是,若是 key 不存在,它不會有 KeyError 的報錯,而是會返回 0

a = Counter('aabc')
print(a['d'])
0

在原先使用字典時,在查找鍵以前,咱們都須要先進行檢驗。而使用 Counter 類型就十分方便。

3. Counter 的加減

其實, Counter 裏面已經實現了對加減號的重載。它能夠實現將兩個計數器裏面的對應值相加或相減。

a = Counter('aabc')
b = Counter('bbcd')
c = a + b
d = a - b
print(c)
print(d)

這段程序運行的結果以下:

Counter({'b': 3, 'a': 2, 'c': 2, 'd': 1})
Counter({'a': 2})

能夠看到,當一個元素的計數被減至0時,它便不會再出現,而不須要單獨處理「個數爲負」的狀況。

不過,若是你想要負的結果,那麼你能夠選擇 subtract() 方法。

a = Counter('aabc')
b = Counter('aaaa')
a.subtract(b)
print(a)
print(+a)
print(-a)

+a-a 能夠返回 Counter 中正的部分與負的部分(不過 -a 返回的負值的相反數)。這一個操做十分經常使用。

Counter({'b': 1, 'c': 1, 'a': -2})
Counter({'b': 1, 'c': 1})
Counter({'a': 2})

4. most_common() - 取出最多的 n 個元素

詞頻統計中,咱們每每須要取出最大的幾個元素,用於後續的分析。而這項功能, Counter 也幫咱們作好了。咱們只須要調用 most_common(n) 方法,就能夠取出 Counter 對象中最多的 n 個元素,並返回一個元組類型。

a = Counter('abracadabra')
print(a.most_common(3))

元組內的每個元素都分別是對應的鍵值,而且已經按照降序排列:

[('a', 5), ('b', 2), ('r', 2)]

僅僅一行,咱們就能夠獲取 Counter 計數器中最多的幾項了,這極大的簡化了咱們的代碼量。

總結

上面的介紹展現了 Counter 計數器的經常使用方法。其實在瞭解它以前,我一直都是用字典作詞頻統計,所以也更發現 Counter 計數器在這一類問題上的簡便性。你們也能夠嘗試一下本身用字典實現這一些功能,這樣便可以更好地理解 Counter 的工做原理。

相關文章
相關標籤/搜索