Python计数器 – Python集合计数器

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