Python計數器 – Python集合計數器

Python Counter類別是Collections模組的一部分。Counter是字典(Dictionary)的子類別,用於追蹤元素及其計數。

Python Counter

Counter是一個無序的集合,元素以Dict鍵的形式存儲,其計數作為字典值。Counter元素的計數可以是正數、零或負數整數。然而,對其鍵和值並無限制。儘管值應該是數字,但我們也可以存儲其他對象。

創建Python Counter對象

我們可以創建一個空的Counter或以一些初始值開始。

from collections import Counter

# 空Counter
counter = Counter()
print(counter)  # Counter()

# 具有初始值的Counter
counter = Counter(['a', 'a', 'b'])
print(counter)  # Counter({'a': 2, 'b': 1})

counter = Counter(a=2, b=3, c=1)
print(counter)  # Counter({'b': 3, 'a': 2, 'c': 1})

我們還可以使用任何可迭代的對象作為創建Counter對象的參數。因此,字符串文字列表也可以用於創建Counter對象。

# 將可迭代物件作為Counter的參數
counter = Counter('abc')
print(counter)  # Counter({'a': 1, 'b': 1, 'c': 1})

# 將列表作為Counter的參數
words_list = ['Cat', 'Dog', 'Horse', 'Dog']
counter = Counter(words_list)
print(counter)  # Counter({'Dog': 2, 'Cat': 1, 'Horse': 1})

# 將字典作為Counter的參數
word_count_dict = {'Dog': 2, 'Cat': 1, 'Horse': 1}
counter = Counter(word_count_dict)
print(counter)  # Counter({'Dog': 2, 'Cat': 1, 'Horse': 1})

如我上面提到的,我們也可以使用非數字數據作為計數值,但這將破壞Counter類的目的。

# Counter也可以處理非數字
special_counter = Counter(name='Pankaj', age=20)
print(special_counter)  # Counter({'name': 'Pankaj', 'age': 20})

Python Counter 方法

讓我們來看看Counter類的方法以及我們可以對其執行的一些其他操作。

獲取元素計數

# 獲取計數
counter = Counter({'Dog': 2, 'Cat': 1, 'Horse': 1})
countDog = counter['Dog']
print(countDog)  # 2

如果我們試圖獲取不存在的鍵的計數,它將返回0,而不是拋出KeyError

# 獲取不存在鍵的計數,不會引發KeyError
print(counter['Unicorn'])  # 0

設置元素計數

我們也可以設置計數器中現有元素的計數。如果元素不存在,則會將其添加到計數器中。

counter = Counter({'Dog': 2, 'Cat': 1, 'Horse': 1})
# 設置計數
counter['Horse'] = 0
print(counter)  # Counter({'Dog': 2, 'Cat': 1, 'Horse': 0})

# 設置計數 for non-existing key, adds to Counter
counter['Unicorn'] = 1
print(counter)  # Counter({'Dog': 2, 'Cat': 1, 'Unicorn': 1, 'Horse': 0})

從 Counter 刪除元素

我們可以使用 del 來從計數器對象中刪除一個元素。

# 刪除 Counter 中的元素
del counter['Unicorn']
print(counter)  # Counter({'Dog': 2, 'Cat': 1, 'Horse': 0})

elements()

此方法返回計數器中元素的列表。只返回計數為正的元素。

counter = Counter({'Dog': 2, 'Cat': -1, 'Horse': 0})

# elements()
elements = counter.elements()  # doesn't return elements with count 0 or less
for value in elements:
    print(value)

上述代碼將打印“Dog”兩次,因為它的計數為2。其他元素將被忽略,因為它們的計數不為正。計數器是一個無序集合,因此元素以無特定順序返回。

most_common(n)

此方法從計數器返回最常見的元素。如果不提供 ‘n’ 的值,則從最常見到最不常見的元素返回排序的字典。我們可以使用切片從此排序的字典中獲取最不常見的元素。

counter = Counter({'Dog': 2, 'Cat': -1, 'Horse': 0})

# most_common()
most_common_element = counter.most_common(1)
print(most_common_element)  # [('Dog', 2)]

least_common_element = counter.most_common()[:-2:-1]
print(least_common_element)  # [('Cat', -1)]

subtract() 和 update()

Counter subtract() 方法用於從另一個計數器中減去元素計數。update() 方法用於從另一個計數器中添加計數。

counter = Counter('ababab')
print(counter)  # Counter({'a': 3, 'b': 3})
c = Counter('abc')
print(c)  # Counter({'a': 1, 'b': 1, 'c': 1})

# subtract
counter.subtract(c)
print(counter)  # Counter({'a': 2, 'b': 2, 'c': -1})

# update
counter.update(c)
print(counter)  # Counter({'a': 3, 'b': 3, 'c': 0})

Python Counter 算術運算

我們還可以對計數器執行一些算術運算,就像操作數字一樣。但是,這些運算只返回計數為正的元素。

# 算術運算
c1 = Counter(a=2, b=0, c=-1)
c2 = Counter(a=1, b=-1, c=2)

c = c1 + c2  # return items having +ve count only
print(c)  # Counter({'a': 3, 'c': 1})

c = c1 - c2  # keeps only +ve count elements
print(c)  # Counter({'a': 1, 'b': 1})

c = c1 & c2  # intersection min(c1[x], c2[x])
print(c)  # Counter({'a': 1})

c = c1 | c2  # union max(c1[x], c2[x])
print(c)  # Counter({'a': 2, 'c': 2})

Python Counter 的其他操作

讓我們看一些代碼片段,了解我們可以對計數器對象執行的其他操作。

counter = Counter({'a': 3, 'b': 3, 'c': 0})
# 其他示例
print(sum(counter.values()))  # 6

print(list(counter))  # ['a', 'b', 'c']
print(set(counter))  # {'a', 'b', 'c'}
print(dict(counter))  # {'a': 3, 'b': 3, 'c': 0}
print(counter.items())  # dict_items([('a', 3), ('b', 3), ('c', 0)])

# 移除計數為0或負的元素
counter = Counter(a=2, b=3, c=-1, d=0)
counter = +counter
print(counter)  # Counter({'b': 3, 'a': 2})

# 清除所有元素
counter.clear()
print(counter)  # Counter()

這就是 Python Counter 類的全部內容。

您可以從我的 GitHub 存儲庫 下載完整的示例代碼。

參考:Python 文件

Source:
https://www.digitalocean.com/community/tutorials/python-counter-python-collections-counter