Python计数器完全指南:掌握集合计数器的使用方法与技巧

这是文章《Python计数器 – Python集合计数器》的第1部分(共1部分)。

内容片段: Python Collections 模块中包含了 Counter 类。Counter 是 Dictionary 的一个子类,用于跟踪元素及其计数。

Python计数器

计数器是无序集合,其中元素被存储为字典键,它们的计数作为字典值。计数器元素的计数可以是正数、零或负整数。但是它的键和值没有任何限制。尽管值通常是数字,但我们也可以存储其他对象。

创建Python的Counter对象

我们可以创建一个空的计数器,也可以从一些初始值开始。

from collections import Counter

# 空计数器
counter = Counter()
print(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('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({'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})

# 为不存在的键设置计数,会添加到Counter中
counter['Unicorn'] = 1
print(counter)  # Counter({'Dog': 2, 'Cat': 1, 'Unicorn': 1, 'Horse': 0})

从计数器中删除一个元素

我们可以使用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()  # 不返回计数为0或更少的元素
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()方法

计数器的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  # 只返回计数为正的项
print(c)  # Counter({'a': 3, 'c': 1})

c = c1 - c2  # 只保留计数为正的元素
print(c)  # Counter({'a': 1, 'b': 1})

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

c = c1 | c2  # 并集 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文档

bannerAds