简介
计数器是用于计数可哈希对象的dict子类。它是一个集合,其中元素存储为字典键,其计数存储为字典值。计数可以是任何整数值,包括零或负计数。
元素是从一个可迭代的对象计数或从另一个映射(或计数器)初始化的
c = Counter() # a new, empty counter
c = Counter('gallahad') # a new counter from an iterable
c = Counter({'red': 4, 'blue': 2}) # a new counter from a mapping
c = Counter(cats=4, dogs=8) # a new counter from keyword args
Counter对象具有一个字典接口,当访问不存在的值时,它为缺失项返回0计数,而字典会引发KeyError(因为访问了字典中不存在的键):
c = Counter(['eggs', 'ham'])
c['bacon'] # count of a missing element is zero
将计数设置为零不会将元素从计数器中删除。使用del将其完全删除:
c['sausage'] = 0 # counter entry with a zero count
del c['sausage'] # del actually removes the entry
作为dict的子类,Counter继承了记住插入顺序的功能。对Counter对象的数学运算也保留顺序。根据在左操作数中首先遇到元素的时间,然后按照在右操作数中遇到的顺序,对结果进行排序。
方法
字典方法
常用的词典方法可用于Counter对象,但有两种方法对Counter的工作方式不同。
fromkeys(iterable)
没有为Counter对象实现此类方法。update([iterable-or-mapping])
元素是从可迭代的或从另一个映射(或计数器)添加的元素中计数的。像dict.update()
一样,但是添加计数而不是替换它们。同样,可迭代对象应该是元素序列,而不是(key,value)对序列。(在某种层面上,可以理解为加法运算)
特殊方法
除了适用于所有词典的方法外,Counter对象还支持三种方法:
elements()
在元素上返回一个迭代器,并重复与其计数相等的次数。元素按首先遇到的顺序返回。如果一个元素的数量少于一个,elements()将忽略它。
c = Counter(a=4, b=2, c=0, d=-2)
sorted(c.elements())
# 返回结果
# ['a', 'a', 'a', 'a', 'b', 'b']
most_common([n])
返回n个最常见元素的列表及其从最常见到最小的计数。如果省略n或None,则most_common()返回计数器中的所有元素。具有相等计数的元素按首先遇到的顺序排序:
Counter('abracadabra').most_common(3)
# 结果
# [('a', 5), ('b', 2), ('r', 2)]
subtract([iterable-or-mapping])
从可迭代对象或另一个映射(或计数器)中减去元素。像dict.update()一样,但是减去计数而不是替换它们。输入和输出都可以为零或负。
c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4)
c.subtract(d)
c
# 结果
# Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})
算术运算
下面四个算术运算结果只含有计数为正的项,否则就是一个空Counter()对象。subtract()和update()方法则没有这些特质。
c = Counter(a=3, b=1)
d = Counter(a=1, b=2)
c + d # add two counters together: c[x] + d[x]
# 结果:Counter({'a': 4, 'b': 3})
c - d # subtract (keeping only positive counts)
# 结果:Counter({'a': 2})
c & d # intersection: min(c[x], d[x])
# 结果:Counter({'a': 1, 'b': 1})
c | d # union: max(c[x], d[x])
# 结果:Counter({'a': 3, 'b': 2})
c = Counter(a=2, b=-4)
+c
# 结果: Counter({'a': 2})
-c
# 结果: Counter({'b': 4})
注意
Counter()主要用于与正整数一起表示运行计数。但是,请注意不要不必要地排除需要其他类型或负值的用例。为了帮助解决这些用例,本节介绍了最小范围和类型限制。
Counter
类本身是一个字典子类,对其键和值没有限制。这些值旨在为代表计数的数字,但是您可以在值字段中存储任何内容。most_common()
方法仅要求值是可排序的。 对于原地操作,例如c [key] + = 1
,值类型仅需要支持加法和减法。因此,分数、浮点数和小数将起作用,并且支持负值。update()
和subtract()
也是如此,它们允许输入和输出均为负值和零值。- 多重集方法仅设计用于具有正值的用例。输入可以为负或零,但仅创建具有正值的输出。没有类型限制,但是值类型需要支持加,减和比较。
elements()
方法需要整数计数。它忽略零和负计数。