前言
本文繼續來盤Python內置集合模塊,這期主要介紹其中的工具類計數器類(Counter)類的使用。我們還是采用“短平快”的模式——文字+代碼,助你多快好省的學會它,并能都收用上它。閑話少敘,開始正文——
Counter
Counter是一個dict子類,用于計數可哈希對象。它是一個集合,其中元素被存儲為字典鍵,它們的計數值被存儲為字典值。計數值可為任何整數值,包括零或負計數。Counter類類似于其他語言中的包或多集。
計數的元素來自可迭代對象或另一個初始化的映射(或計數器)。下面是Python中創建Counter對象的一些方式。請看示例代碼:
from collections import Counter
# 創建一個空的Counter對象
c1 = Counter()
print(c1)
# 從可迭代對象創建新的Counter對象
c2 = Counter('aabbbcddeeee')
print(c2)
# 從映射創建新的的Counter對象
c3 = Counter({'orange': 6, 'red': 3, 'green': 5})
print(c3)
# 從關鍵字參數創建Counter對象
c4 = Counter(cats=4, dogs=8)
print(c4)
程序運行結果如下所示:
Counter()
Counter({'e': 4, 'b': 3, 'a': 2, 'd': 2, 'c': 1})
Counter({'orange': 6, 'green': 5, 'red': 3})
Counter({'dogs': 8, 'cats': 4})
Counter對象有一個字典接口,只是它們會為丟失的項返回一個零計數,而不是引發KeyError,示例如下:
# 存在元素計算
c5 = Counter(['eggs', 'ham', 'jar ', 'ham'])
print(c5['ham'])
# 缺失元素計數為0
print(c5['bacon'])
輸出結果如下:
從Counter中刪除元素
要從Counter中刪除元素,可以使用del關鍵字。請記住,將計數設置為零并不會從計數器中刪除一個元素。請看示例代碼:
# –從Counter對象刪除元素 – #
# 0計數的counter條目項
c5['sausage'] = 0
print(c5)
# del 實際刪除條目項
del c5['sausage']
print(c5)
輸出結果為:
Counter({'ham': 2, 'eggs': 1, 'jar ': 1, 'sausage': 0})
Counter({'ham': 2, 'eggs': 1, 'jar ': 1})
如代碼所示,我們將0設置為計數器中不存在的項。Python將該項以零值添加到Counter中。在第7行中,我們使用del關鍵字完全刪除該項。很明顯,計數為0,并不會刪除Counter中的計數項,而要刪除之,得用del命令才行。
Counter方法
Counter對象除了支持所有字典可用的方法之外,以下是其特有最常見方法:返回一個迭
1)elements():
返回迭代器,其為重復相應元素次數與其計數值相等的迭代器。按第一次遇到的順序返回元素。如果一個元素的計數小于1,elements()將忽略它。示例如下:
# – Counter 對象方法 – #
# elements()
counter = Counter(a=1, b=2, c=0, d=-2, e=4)
sorted_elements = sorted(counter.elements())
print(sorted_elements)
輸出結果為:
['a', 'b', 'b', 'e', 'e', 'e', 'e']
2)most_common([n]):
返回n個最常見元素的列表,元素的計數大小從最大到最小。如果省略n或None, most_common()將返回計數器中的所有元素。計數相等的元素按第一次遇到的順序排列:
# 2)most_common()
most_common_3 = Counter('abracadabrae').most_common(3)
print(most_common_3)
輸出結果為:
[('a', 5), ('b', 2), ('r', 2)]
3)subtract([iterable-or-mapping]):
從可迭代對象或另一個映射(或計數器)中減去元素。像dict.update(),但是減去計數而不是替換它們。輸入和輸出都可能是零或負的。示例如下:
# 3)subtract()
c_1 = Counter(a=4, b=2, c=0, d=-2)
c_2 = Counter(a=1, b=2, c=3, d=4)
c_1.subtract(c_2)
print(c_1)
輸出結果如下:
[('a', 5), ('b', 2), ('r', 2)]
4)兩個方法
通常的字典方法可用于Counter對象,但有兩個方法針對計數器的工作方式不同:
fromkeys(iterable):
這個類方法Counter對象沒實現。
update([iterable-or-mapping]):
從可迭代對象中計數元素,或從另一個映射(或計數器)中添加元素。類似dict.update(),但Counter是增加計數而不是替換它們。而且,迭代對象應該是元素序列,而不是(鍵,值)對的序列。示例如下:
# 4)update()
d = Counter(a=3, b=1)
d.update({'a': 5, 'c': 4})
print(d)
d.update('aBac')
print(d)
d.update(dict([('a',10),('e',9)]))
print(d)
#但不要這樣:
d.update([('a',10),('e',9)])
print(d)
請注意下面的輸出結果:
Counter({'a': 8, 'c': 4, 'b': 1})
Counter({'a': 10, 'c': 5, 'b': 1, 'B': 1})
Counter({'a': 20, 'e': 9, 'c': 5, 'b': 1, 'B': 1})
Counter({'a': 20, 'e': 9, 'c': 5, 'b': 1, 'B': 1, ('a', 10): 1, ('e', 9): 1})
1.1.1 數學式操作
Counter提供了幾種數學操作來組合Counter對象運算,以生成多集(計數大于零的計數器)。加減法通過加減相應元素的計數來合并計數器。交集和并集返回對應計數的最小值和最大值。每個操作都可以接受帶符號計數值的輸入,但輸出將排除計數為零或更少的結果。
c = Counter(a=3, b=1)
d = Counter(a=1, b=2)
print(c + d)
print(c - d)
print(c & d)
print(c | d )
輸出結果類似如下:
Counter({'a': 4, 'b': 3})
Counter({'a': 2})
Counter({'a': 1, 'b': 1})
Counter({'a': 3, 'b': 2})
一元加減法是與空計數器相加或與空計數器相減的快捷方式。示例如下:
#一元加減
c = Counter(a=2, b=-4)
print(+c)# 一元加
print(-c)# 一元減
輸出結果如下:
Counter({'a': 2})
Counter({'b': 4})
簡而言之,可利用Counter對象實現一些相關數據的統計分析。
本文小結
本篇文章主要介紹了Python內置集合模塊的工具類Counter的使用,并結合代碼和描述,以期深入淺出的幫助你更好的理解和掌握Counter相關內容和應用。若是初學者,記得一定要動手實踐一把才是最佳學習模式。