Counter
是一个简单的计数器,例如,统计字符出现的个数:
>>> # 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
的子类,用于计数可哈希对象。它是一个集合,元素像字典键(key)一样存储,它们的计数存储为值。计数可以是任何整数值,包括 0 和负数。Counter
类有点像其他语言中的 bags 或 multisets。元素从一个 iterable 被计数或从其他的 mapping (or counter)初始化:
Counter
对象有一个字典接口,如果引用的键没有任何记录,就返回一个0,而不是弹出一个 KeyError
:
>>> c = Counter(['eggs', 'ham'])
>>> c['bacon'] # count of a missing element is zero
0
设置一个计数为0不会从计数器中移去一个元素。使用 del
来删除它:
>>> c['sausage'] = 0 # counter entry with a zero count
>>> del c['sausage'] # del actually removes the entry
特有方法 | 解释 |
---|---|
init |
初始化,参数为可迭代对象即可 |
elememts() |
返回一个迭代器,其中每个元素将重复出现计数值所指定次。 元素会按首次出现的顺序返回。 如果一个元素的计数值小于一,elements() 将会忽略它。 |
most_common([*n*]) |
返回一个列表,其中包含 n 个最常见的元素及出现次数,按常见程度由高到低排序。 如果 n 被省略或为 None ,most_common() 将返回计数器中的 所有 元素。 计数值相等的元素按首次出现的顺序排序 |
subtract([iterable-or-mapping]) |
从 迭代对象 或 映射对象 减去元素。像 dict.update() 但是是减去,而不是替换。输入和输出都可以是0或者负数。 |
update([iterable-or-mapping]) |
从 迭代对象 计数元素或者 从另一个 映射对象 (或计数器) 添加。 像 dict.update() 但是是加上,而不是替换。另外,迭代对象 应该是序列元素,而不是一个 (key, value) 对。 |
[] |
返回键对应的值,如果键不存在,那么返回 0 |
+ |
加法,返回一个新的 counter 对象,如果前面不存在,则默认加上一个对应键,值为 0 的 counter |
- |
减法,返回一个新的 counter 对象,如果前面不存在,则默认用对应键,值为 0 的 counter 来减,其中值正数会变负数,负数变为正数 |
& |
min 操作,取相对应的键的最小值,返回一个新的 counter 对象 |
| |
max操作,取相对应的键的最大值,返回一个新的 counter 对象 |
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> sorted(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']
>>> Counter('abracadabra').most_common(3)
[('a', 5), ('b', 2), ('r', 2)]
>>> 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})
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
对象,以生产 multisets (计数器中大于0的元素)。 加和减,结合计数器,通过加上或者减去元素的相应计数。交集和并集返回相应计数的最小或最大值。每种操作都可以接受带符号的计数,但是输出会忽略掉结果为零或者小于零的计数。
>>> 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
类是一个字典的子类,不限制键和值。值用于表示计数,但你实际上 可以 存储任何其他值。most_common()
方法在值需要排序的时候用。原地操作比如
c[key] += 1
, 值类型只需要支持加和减。 所以分数,小数,和十进制都可以用,负值也可以支持。这两个方法update()
和subtract()
的输入和输出也一样支持负数和0。Multiset多集合方法只为正值的使用情况设计。输入可以是负数或者0,但只输出计数为正的值。没有类型限制,但值类型需要支持加,减和比较操作。
elements()
方法要求正整数计数。忽略0和负数计数。