计数器Counter对象 – collections – 容器数据类型(28)Python语言(必读进阶学习教程)(参考资料)
提供计数工具,支持方便快捷的计数。例如:
>>> # Tally occurrences of words in a list >>> cnt = Counter() >>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']: ... cnt[word] += 1 >>> cnt Counter({'blue': 3, 'red': 2, 'green': 1}) >>> # Find the ten most common words in Hamlet >>> import re >>> words = re.findall(r'\w+', open('hamlet.txt').read().lower()) >>> Counter(words).most_common(10) [('the', 1143), ('and', 966), ('to', 762), ('of', 669), ('i', 631), ('you', 554), ('a', 546), ('my', 514), ('hamlet', 471), ('in', 451)]
class collections.
Counter
([iterable-or-mapping])
Counter
是dict
用于计算可散列对象的子类。它是一个集合,其中元素存储为字典键,它们的计数存储为字典值。计数可以是任何整数值,包括零或负计数。该类Counter
类似于其他语言中的 bags 或 multisets。
元素是从可迭代的或从另一个映射(或计数器)初始化的 :
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 对象有一个字典接口,除了它们为丢失的项目返回零计数而不是引发KeyError
:
>>> c = Counter(['eggs', 'ham']) >>> c['bacon'] # count of a missing element is zero 0
将计数设置为零不会从计数器中删除元素。用于del
完全删除它:
c['sausage'] = 0 # counter entry with a zero count del c['sausage'] # del actually removes the entry
3.1 版中的新功能。
除了可用于所有词典的方法外,计数器对象还支持三种方法:
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 个最常见元素的列表及其从最常见到最少的计数。如果省略nNone
或, 则most_common()
返回计数器中的所有元素。具有相等计数的元素是任意排序的:
>>> Counter('abracadabra').most_common(3) [('a', 5), ('r', 2), ('b', 2)]
iterable-or-mappingsubtract([
])
从可迭代对象或另一个映射 (或计数器)中减去元素。喜欢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})
-
-
3.2 版中的新功能。
通常的字典方法可用于
Counter
对象,除了两个对计数器的工作方式不同。
iterablefromkeys(
)
- 此类方法不是为
Counter
对象实现的。
iterable-or-mappingupdate([
])
- 元素是从可迭代的或从另一个映射(或计数器)添加的。 像 dict.update() 但增加计数而不是替换它们。 此外,可迭代对象应该是一系列元素,而不是一系列(键,值)对。
-
使用对象的常见模式Counter
:
sum(c.values()) # total of all counts c.clear() # reset all counts list(c) # list unique elements set(c) # convert to a set dict(c) # convert to a regular dictionary c.items() # convert to a list of (elem, cnt) pairs Counter(dict(list_of_pairs)) # convert from a list of (elem, cnt) pairs c.most_common()[:-n-1:-1] # n least common elements +c # remove zero and negative counts
提供了几种数学运算来组合Counter
对象以产生多重集(计数大于零的计数器)。加法和减法通过添加或减去相应元素的计数来组合计数器。交集和并集返回相应计数的最小值和最大值。每个操作都可以接受带符号计数的输入,但输出将排除计数为零或更少的结果。
>>> 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})
3.3 新版功能:添加了对一元加、一元减和就地多重集操作的支持。
笔记
计数器主要设计用于使用正整数来表示运行计数;但是,注意不要不必要地排除需要其他类型或负值的用例。为了帮助处理这些用例,本部分记录了最小范围和类型限制。
- 该类
Counter
本身是一个字典子类,对其键和值没有限制。这些值是代表计数的数字,但您可以在值字段中存储任何内容。 - 该
most_common()
方法只要求值是可排序的。 - 对于c[key] += 1 等就地操作,值类型只需要支持加减。 所以分数、浮点数和小数都可以工作,并且支持负值。 update() 和 subtract() 也是如此,它们允许输入和输出的负值和零值。
- 多重集方法仅适用于具有正值的用例。输入可以是负数或零,但只会创建具有正值的输出。没有类型限制,但值类型需要支持加减比较。
- 该
elements()
方法需要整数计数。它忽略零和负计数。