Python Counter类是Collections模块的一部分。Counter是字典的子类,用于跟踪元素及其计数。
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。其他元素将被忽略,因为它们的计数不为正。Counter 是一个无序集合,因此元素以无特定顺序返回。
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 计数器算术操作
我们还可以对计数器执行一些算术操作,就像操作数字一样。但是,这些操作只返回具有正计数的元素。
# 算术操作
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({'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 计数器类的全部内容。
您可以从我的 GitHub 代码库下载完整的示例代码。
参考:Python 文档
Source:
https://www.digitalocean.com/community/tutorials/python-counter-python-collections-counter