在作文本統計分析的時候,咱們常常會須要進行「計數」這樣一個環節。而若是直接使用字典,代碼不免會變得複雜。其實, collections 模塊中早就給咱們定義好了 Counter 類,它能夠很方便地實現計數的功能。python
只須要使用 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
Counter 獲取值的方法與字典相似,只須要用 [key]
就能夠獲取對應的值。不過它與原先的字典不同的是,若是 key
不存在,它不會有 KeyError
的報錯,而是會返回 0
。
a = Counter('aabc') print(a['d'])
0
在原先使用字典時,在查找鍵以前,咱們都須要先進行檢驗。而使用 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})
詞頻統計中,咱們每每須要取出最大的幾個元素,用於後續的分析。而這項功能, Counter 也幫咱們作好了。咱們只須要調用 most_common(n)
方法,就能夠取出 Counter 對象中最多的 n
個元素,並返回一個元組類型。
a = Counter('abracadabra') print(a.most_common(3))
元組內的每個元素都分別是對應的鍵值,而且已經按照降序排列:
[('a', 5), ('b', 2), ('r', 2)]
僅僅一行,咱們就能夠獲取 Counter 計數器中最多的幾項了,這極大的簡化了咱們的代碼量。
上面的介紹展現了 Counter 計數器的經常使用方法。其實在瞭解它以前,我一直都是用字典作詞頻統計,所以也更發現 Counter 計數器在這一類問題上的簡便性。你們也能夠嘗試一下本身用字典實現這一些功能,這樣便可以更好地理解 Counter 的工做原理。