You are here:  Home » Python » 计数器Counter对象-collections- 容器数据类型(28)Python语言(必读进阶学习教程)(参考资料)

>>> c['sausage'] = 0                        # counter entry with a zero count
>>> del c['sausage']                        # del actually removes the entry

 

提供计数器工具以支持方便和快速的计数。例如:

>>>
>>> # 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.Counteriterable-or-mapping 

Counterdict用于计算可哈希对象的子类。它是一个集合,其中元素存储为字典键,它们的计数存储为字典值。计数允许为任何整数值,包括零或负计数。该Counter 班是类似于其他语言包或者多集。

元素从可迭代计数或从另一个映射(或计数器)初始化 :

>>> 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

 

计数器对象具有字典界面,除了它们为缺少的项返回零计数而不是提出KeyError

>>> c = Counter(['eggs', 'ham'])
>>> c['bacon']                              # count of a missing element is zero
0

 

将计数设置为零不会从计数器中删除元素。用于del完全删除它:


3.1版中的新功能。

Counter对象支持除所有字典可用的方法之外的三种方法:

elements
在元素上返回一个迭代器,重复每个元素的次数。元素以任意顺序返回。如果元素的计数小于1,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)  # doctest: +SKIP
[('a', 5), ('r', 2), ('b', 2)]

 

subtractiterable-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可迭代的
没有为Counter对象实现此类方法。
updateiterable-or-mapping 
元素从可迭代计数或从另一个 映射(或计数器)添加。喜欢dict.update()但添加计数而不是替换它们。此外,期望迭代是元素序列,而不是对序列。(key, value)

使用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]) # doctest: +SKIP
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] += 1update()subtract()
  • multiset方法仅适用于具有正值的用例。输入可以是负数或零,但仅创建具有正值的输出。没有类型限制,但值类型需要支持加法,减法和比较。
  • elements()方法需要整数计数。它忽略了零和负数。

也可以看看

  • Smalltalk中的Bag类。

  • 维基百科的Multisets条目。

  • 带有示例的C ++多线程教程。

  • 有关多集合及其用例的数学运算,请参阅 Knuth,Donald。

  • 要枚举给定元素集上给定大小的所有不同多重集,请参阅itertools.combinations_with_replacement()

    map(Counter, combinations_with_replacement('ABC', 2)) # --> AA AB AC BB BC CC