溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python中的Counter模塊怎么使用

發(fā)布時(shí)間:2023-04-15 13:56:24 來(lái)源:億速云 閱讀:106 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容主要講解“Python中的Counter模塊怎么使用”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Python中的Counter模塊怎么使用”吧!

描述

項(xiàng)目描述
Python 解釋器3.10.6

Counter 模塊

在 Python 的 collections 模塊中,有一個(gè)很常用的模塊就是 Counter。Counter 是一個(gè)簡(jiǎn)單的計(jì)數(shù)器,用于統(tǒng)計(jì)某些可哈希對(duì)象的數(shù)量。它以字典的形式存儲(chǔ)元素和它們的計(jì)數(shù)。

Counter() 類

Counter() 能夠?qū)魅虢o該類的參數(shù)按照一定規(guī)則進(jìn)行計(jì)數(shù),并將計(jì)數(shù)對(duì)象與計(jì)數(shù)結(jié)果作為鍵值對(duì)以字典的形式進(jìn)行結(jié)果的返回。

Counter(iterable=None, /, **kwds)

舉個(gè)栗子

from collections import Counter
# 返回一個(gè)空的 Counter 對(duì)象
cnt = Counter()
print(cnt)

# 將可迭代對(duì)象(字符串)作為參數(shù)
cnt = Counter('Hello World')
print(cnt)

# 將可迭代對(duì)象(列表)作為參數(shù)
cnt = Counter(['a', 'a', 'b', 'd', 'c', 'd'])
print(cnt)

# 使用可迭代對(duì)象(字典)作為參數(shù)
cnt = Counter({'a': 1, 'b': 2, 'd': 3, 'c': 2})
print(cnt)

# 使用關(guān)鍵字參數(shù)
cnt = Counter(a=1, b=2, d=3, c=2)
print(cnt)

執(zhí)行效果

Counter()
Counter({'l': 3, 'o': 2, 'H': 1, 'e': 1, ' ': 1, 'W': 1, 'r': 1, 'd': 1})
Counter({'a': 2, 'd': 2, 'b': 1, 'c': 1})
Counter({'d': 3, 'b': 2, 'c': 2, 'a': 1})
Counter({'d': 3, 'b': 2, 'c': 2, 'a': 1})

Counter() 對(duì)象

字典

Counter() 返回的結(jié)果為一個(gè)字典,它擁有普通字典的大部分方法。在大多數(shù)情況下,你可以像操作字典一樣操作 Counter 對(duì)象。對(duì)此,請(qǐng)參考如下示例:

from collections import Counter
cnt = Counter('Hello World')
print(cnt)

# 輸出 Counter 對(duì)象中的鍵值對(duì)列表
print(cnt.items())

# 移除 Counter 對(duì)象中的最后一個(gè)鍵值對(duì)
print(cnt.popitem())
print(cnt)

# 輸出 Counter 中鍵 l 對(duì)應(yīng)的值
print(cnt['l'])

執(zhí)行結(jié)果

Counter({'l': 3, 'o': 2, 'H': 1, 'e': 1, ' ': 1, 'W': 1, 'r': 1, 'd': 1})
dict_items([('H', 1), ('e', 1), ('l', 3), ('o', 2), (' ', 1), ('W', 1), ('r', 1), ('d', 1)])
('d', 1)
Counter({'l': 3, 'o': 2, 'H': 1, 'e': 1, ' ': 1, 'W': 1, 'r': 1})
3

有序性

Python 中的字典是無(wú)序的,無(wú)序的 的含義并不是說(shuō)字典中的鍵值對(duì)沒(méi)有順序,而是指字典中的鍵值對(duì)的順序是不可預(yù)測(cè)的。對(duì)此,請(qǐng)參考如下示例:

d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
    print(key)

該示例的輸出結(jié)果可能是:

a
b
c

也可能是:

b
c
a

當(dāng)然還存在其他可能,這里就不一一列舉了。

Python 官方對(duì) Python 3.6 版本中的字典進(jìn)行了優(yōu)化,使其能夠記住鍵值對(duì)插入的順序。此后,字典顯得不那么凌亂了(字典中的鍵值對(duì)的順序變得可以預(yù)測(cè)了)。

KeyError

在 Python 的內(nèi)置字典中,若嘗試訪問(wèn)不存在的鍵,Python 將拋出 KeyError 異常錯(cuò)誤。對(duì)此,請(qǐng)參考如下示例:

d = dict([('a', 1), ('b', 2), ('c', 3)])
print(d)

# 嘗試訪問(wèn)字典 d 中不存在的鍵
print(d['d'])

執(zhí)行效果

Traceback (most recent call last):
  File "C:\main.py", line 5, in <module>
    print(d['d'])
KeyError: 'd'
{'a': 1, 'b': 2, 'c': 3}

同樣的場(chǎng)景。這一次,我們讓 Counter 作為主角。

from collections import Counter
cnt = Counter({'a': 1, 'b': 2, 'c': 3})
print(cnt)

# 嘗試訪問(wèn) Counter 中不存在的鍵
print(cnt['d'])

執(zhí)行效果

訪問(wèn) Counter 對(duì)象中不存在的鍵時(shí),并不會(huì)拋出 KeyError 異常,而是返回默認(rèn)計(jì)數(shù)值 0。

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

魔術(shù)方法 __missing__

__missing__() 是 Python 中的一個(gè)特殊方法,用于處理通過(guò)鍵訪問(wèn)字典中的值時(shí)鍵不存在時(shí)的情況。
當(dāng)我們使用字典的索引來(lái)訪問(wèn)一個(gè)不存在的鍵時(shí),Python 將會(huì)調(diào)用特殊方法 __missing__() 來(lái)嘗試返回一個(gè)合適的值。若未實(shí)現(xiàn) __missing__() 方法,Python 將會(huì)拋出 KeyError 異常。對(duì)此,請(qǐng)參考如下示例:

# 創(chuàng)建一個(gè)字典對(duì)象,該對(duì)象繼承自 Python 內(nèi)置的 dict 對(duì)象
class MyDict(dict):
    def __missing__(self, key):
        return 0

# 實(shí)例化 MyDict() 對(duì)象
myDict = MyDict()
# 嘗試訪問(wèn) myDict 對(duì)象中不存在的鍵 a
print(myDict['a'])

執(zhí)行效果

0

update() 方法

Counter 對(duì)象與 dict 對(duì)象同樣實(shí)現(xiàn)了 update() 方法。使用 update() 方法能夠?qū)⒆鳛閰?shù)的字典合并到調(diào)用該方法的 dict 對(duì)象中。不同的是,dict 對(duì)象的 update() 方法在遇到具有相同的鍵時(shí),將會(huì)對(duì)該鍵對(duì)應(yīng)的值執(zhí)行 覆蓋 操作。而 Counter 對(duì)象的 update() 方法在遇到具有相同的鍵時(shí),將會(huì)對(duì)該鍵對(duì)應(yīng)的值執(zhí)行 疊加 操作。對(duì)此,請(qǐng)參考如下示例:

from collections import Counter
# Python 中內(nèi)置的 dict 對(duì)象
d = dict([('a', 1), ('b', 2), ('c', 3)])
print(d)

d.update({'a': 4})
print(d)

print()

# Counter 對(duì)象
cnt = Counter({'a': 1, 'b': 2, 'c': 3})
print(cnt)

cnt.update({'a': 4})
print(cnt)

執(zhí)行效果

{'a': 1, 'b': 2, 'c': 3}
{'a': 4, 'b': 2, 'c': 3}

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

Counter 對(duì)象的常用方法

most_common()

most_common() 方法將返回一個(gè)列表,列表中的元素均為 Counter 對(duì)象中的鍵值對(duì)組成的元組。元組在列表中的順序取決于計(jì)數(shù)值(鍵值對(duì)中的值)的大小。計(jì)數(shù)值更大的元組將位于列表的前端,計(jì)數(shù)值相等的元組將按照它們首次在列表中出現(xiàn)的順序進(jìn)行排列(先出現(xiàn)的元組將更靠近列表的前端)。
most_common() 默認(rèn)將使用 Counter 對(duì)象中所有的鍵值對(duì)組成的元組作為返回列表中的元素。你可以通過(guò)向該方法提供一個(gè)數(shù)值,該數(shù)值將指定放回的列表中的元素的數(shù)量。

舉個(gè)栗子

from collections import Counter
cnt = Counter({'a': 1, 'b': 2, 'c': 3})
print(cnt)

print()

print(cnt.most_common())
# 返回由 Counter 中計(jì)數(shù)值最大的兩個(gè)
# 鍵值對(duì)構(gòu)成的元組所組成的列表
print(cnt.most_common(2))
# 返回由 Counter 中計(jì)數(shù)值最大的
# 鍵值對(duì)構(gòu)成的元組所組成的列表
print(cnt.most_common(1))

執(zhí)行效果

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

[('c', 3), ('b', 2), ('a', 1)]
[('c', 3), ('b', 2)]
[('c', 3)]

elements()

elements() 方法將返回一個(gè)以 Counter 對(duì)象中的鍵為元素的迭代器,其中每個(gè)元素將重復(fù)出現(xiàn)計(jì)數(shù)值所指定的次數(shù)。

迭代器中的元素將存在如下特點(diǎn):

  • 元素將會(huì)按照其首次添加到 Counter 對(duì)象中的順序進(jìn)行返回。

  • 某個(gè)鍵對(duì)應(yīng)的計(jì)數(shù)值小于一,那么該鍵將不會(huì)作為元素出現(xiàn)在 element() 方法返回的迭代器中。

舉個(gè)栗子

from collections import Counter
cnt = Counter({'a': 1, 'b': 2, 'c': 3, 'd': -4})
print(cnt)

print()

print(list(cnt.elements()))

執(zhí)行效果

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

['a', 'b', 'b', 'c', 'c', 'c']

total()

total() 方法將返回 Counter 對(duì)象中,所有計(jì)數(shù)值累加后得到的結(jié)果。對(duì)此,請(qǐng)參考如下示例:

from collections import Counter
cnt = Counter({'a': 1, 'b': 2, 'c': 3, 'd': -4})
cnt1 = Counter('Hello World')
print(cnt.total())
print(cnt1.total())

執(zhí)行效果

2
11

subtract()

該方法的效果與 Counter 對(duì)象的 update() 方法類似。如果說(shuō) update() 方法執(zhí)行的是 操作,那么 subtract() 方法執(zhí)行的則是 操作。對(duì)此,請(qǐng)參考如下示例:

from collections import Counter
cnt = Counter({'a': 1, 'b': 2, 'c': 3, 'd': -4})

cnt.subtract({'a': 0, 'b': 1, 'd': -11})
print(cnt)

執(zhí)行效果

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

Counter 對(duì)象間的運(yùn)算

注:

本部分內(nèi)容中講解到的運(yùn)算符僅能在 Python 3.3 及以后版本中正常使用。

加法運(yùn)算

在 Python 的 Counter 模塊中,兩個(gè) Counter 對(duì)象可以相加,相加后將返回一個(gè)新的 Counter 對(duì)象,其中每個(gè)元素的計(jì)數(shù)是兩個(gè)原始 Counter 對(duì)象中該元素計(jì)數(shù)的總和??梢酝ㄟ^(guò)使用加法運(yùn)算符來(lái)執(zhí)行此操作。對(duì)此,請(qǐng)參考如下示例:

from collections import Counter

cnt = Counter('Hello')
cnt1 = Counter('World')

print(cnt)
print(cnt1)
print(cnt + cnt1)

執(zhí)行效果

Counter({'l': 2, 'H': 1, 'e': 1, 'o': 1})
Counter({'W': 1, 'o': 1, 'r': 1, 'l': 1, 'd': 1})
Counter({'l': 3, 'o': 2, 'H': 1, 'e': 1, 'W': 1, 'r': 1, 'd': 1})

注:

在 Counter 對(duì)象間的運(yùn)算過(guò)程中,對(duì)于 Counter 中不存在的鍵,其計(jì)數(shù)值為零。

減法運(yùn)算

在 Python 的 Counter 模塊中,可以使用減法運(yùn)算符來(lái)對(duì)兩個(gè) Counter 對(duì)象進(jìn)行減法運(yùn)算,即將左側(cè) Counter 對(duì)象中的計(jì)數(shù)器值減去右側(cè) Counter 對(duì)象中相同鍵的計(jì)數(shù)器值,最后返回一個(gè)新的 Counter 對(duì)象。對(duì)此,請(qǐng)參考如下示例:

from collections import Counter

cnt = Counter('cook')
cnt1 = Counter('coder')

print(cnt)
print(cnt1)
print(cnt - cnt1)

執(zhí)行效果

Counter({'o': 2, 'c': 1, 'k': 1})
Counter({'c': 1, 'o': 1, 'd': 1, 'e': 1, 'r': 1})
Counter({'o': 1, 'k': 1})

注:

在 Counter 對(duì)象間的運(yùn)算過(guò)程中,對(duì)于 Counter 中不存在的鍵,其計(jì)數(shù)值為零。

并集運(yùn)算

Counter 對(duì)象之間的并集運(yùn)算是指兩個(gè) Counter 對(duì)象按照鍵的并集進(jìn)行運(yùn)算,返回的結(jié)果是一個(gè)新的 Counter 對(duì)象,其中包含的鍵和值均為 原始 Counter 對(duì)象中存在的鍵及其對(duì)應(yīng)的最大值。對(duì)此,請(qǐng)參考如下示例:

from collections import Counter

cnt = Counter('Hello')
cnt1 = Counter('World')

print(cnt)
print(cnt1)
print(cnt | cnt1)

執(zhí)行效果

Counter({'l': 2, 'H': 1, 'e': 1, 'o': 1})
Counter({'W': 1, 'o': 1, 'r': 1, 'l': 1, 'd': 1})
Counter({'l': 2, 'H': 1, 'e': 1, 'o': 1, 'W': 1, 'r': 1, 'd': 1})

交集運(yùn)算

Counter 對(duì)象之間的交集運(yùn)算是指兩個(gè) Counter 對(duì)象按照鍵的交集進(jìn)行運(yùn)算,返回的結(jié)果是一個(gè)新的 Counter 對(duì)象,其中包含的鍵和值均為 原始 Counter 對(duì)象中共同擁有的鍵及其對(duì)應(yīng)的最小值。對(duì)此,請(qǐng)參考如下示例:

from collections import Counter

cnt = Counter('Hello')
cnt1 = Counter('World')

print(cnt)
print(cnt1)
print(cnt & cnt1)

執(zhí)行效果

Counter({'l': 2, 'H': 1, 'e': 1, 'o': 1})
Counter({'W': 1, 'o': 1, 'r': 1, 'l': 1, 'd': 1})
Counter({'l': 1, 'o': 1})

單目運(yùn)算

單目運(yùn)算指的是表達(dá)式中存在單目運(yùn)算符的運(yùn)算操作。存在兩種單目運(yùn)算符,即單目減法運(yùn)算符與單目加法運(yùn)算符。無(wú)論是單目減法運(yùn)算符還是單目加法運(yùn)算符,它們的操作對(duì)象均為 Counter 對(duì)象中的計(jì)數(shù)值。
在對(duì) Counter 對(duì)象進(jìn)行單目運(yùn)算后,將返回一個(gè)由大于零的計(jì)數(shù)值相關(guān)的鍵值對(duì)組成的 Counter 對(duì)象。對(duì)此,請(qǐng)參考如下示例:

from collections import Counter

cnt = Counter({'a': 4, 'b': 3, 'd': 0, 'c': -5})
print(+cnt)
print(-cnt)

執(zhí)行效果

Counter({'a': 4, 'b': 3})
Counter({'c': 5})

Counter 對(duì)象間的比較

Python 3.10 版本開(kāi)始,Counter 對(duì)象間開(kāi)始支持常見(jiàn)的比較運(yùn)算符,這些運(yùn)算符有:

  • <

  • <=

  • >

  • >=

  • ==

  • !=

這里以 >== 為例進(jìn)行講解。

>

當(dāng) > 的左側(cè)的 Counter 對(duì)象的鍵對(duì)應(yīng)的計(jì)數(shù)值均大于該符號(hào)右側(cè)的 Counter 對(duì)象中相同的鍵(對(duì)于 Counter 中不存在的鍵,其計(jì)數(shù)值為零)對(duì)應(yīng)的計(jì)數(shù)值時(shí),比較結(jié)果為 True。否則為 False。對(duì)此,請(qǐng)參考如下示例:

from collections import Counter

cnt = Counter({'a': 4, 'b': 3, 'd': 7, 'c': 5})
cnt1 = Counter({'c': 3, 'd': 2, 'b': 6, 'a': 4})
cnt2 = Counter({'c': 4, 'd': 6, 'b': 2, 'a': 3})

print(cnt > cnt1)
print(cnt > cnt2)

執(zhí)行效果

False
True

==

當(dāng) == 的左側(cè)的 Counter 對(duì)象的鍵對(duì)應(yīng)的計(jì)數(shù)值均等于該符號(hào)右側(cè)的 Counter 對(duì)象中相同的鍵(對(duì)于 Counter 中不存在的鍵,其計(jì)數(shù)值為零)對(duì)應(yīng)的計(jì)數(shù)值時(shí),比較結(jié)果為 True。否則為 False。對(duì)此,請(qǐng)參考如下示例:

from collections import Counter

cnt = Counter({'a': 3, 'b': 2, 'd': 6, 'c': 4})
cnt1 = Counter({'c': 3, 'd': 2, 'b': 6, 'a': 4})
cnt2 = Counter({'c': 4, 'd': 6, 'b': 2, 'a': 3})

print(cnt == cnt1)
print(cnt == cnt2)

執(zhí)行效果

False
True

到此,相信大家對(duì)“Python中的Counter模塊怎么使用”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI