You are here:  Home » Python » 计数器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])

Counterdict用于计算可散列对象的子类。它是一个集合,其中元素存储为字典键,它们的计数存储为字典值。计数可以是任何整数值,包括零或负计数。该类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 个最常见元素的列表及其从最常见到最少的计数。如果省略nNone或, 则most_common()返回计数器中的所有元素。具有相等计数的元素是任意排序的:

>>> Counter('abracadabra').most_common(3)  
[('a', 5), ('r', 2), ('b', 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})

3.2 版中的新功能。

通常的字典方法可用于Counter对象,除了两个对计数器的工作方式不同。

fromkeys(iterable)
此类方法不是为Counter对象实现的。
update([iterable-or-mapping])
元素是从可迭代的或从另一个映射(或计数器)添加的。 像 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()方法需要整数计数。它忽略零和负计数。