collections.Counter([iterable-or-mapping])用于统计各元素的计数,结果为map,可选的参数为迭代对象或字典map。
>>> c2=Counter('banana') #创建字符串的Counter对象
>>> c2
Counter({'a': 3, 'n': 2, 'b': 1})
>>> c2=Counter({'a':2,'b':3})
>>> c2
Counter({'b': 3, 'a': 2})
>>> c3=Counter(a=3,b=5) #创建关键字参数的Counter对象
>>> c3
Counter({'b': 5, 'a': 3})
>>> c3['b'] #访问Counter对象的键
5
>>> c3['aa'] #如果键值不存在,返回0
0
>>> c3.elements #返回列表元素
<bound method Counter.elements of Counter({'b': 5, 'a': 3})>
most_common(n) #返回计数值中最大的n个元素的元组
>>> c1.most_common(5)
[('asdf', 6), ('asd', 5), ('sadf', 3), ('df', 3), ('aa', 3)]
# subtract([iterable-or-mapping]) counter按照相应的元素,计数相减
>>> 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})
# update([iterable-or-mapping]) 不同于字典的update方法,这里更新counter时,相同的key的value值相加而不是覆盖
# Counter 间的数学集合操作
>>> c = Counter(a=3, b=1, c=5)
>>> d = Counter(a=1, b=2, d=4)
>>> c + d # counter相加, 相同的key的value相加
Counter({'c': 5, 'a': 4, 'd': 4, 'b': 3})
>>> c - d # counter相减, 相同的key的value相减,只保留正值得value
Counter({'c': 5, 'a': 2})
>>> c & d # 交集: 取两者都有的key,value取小的那一个
Counter({'a': 1, 'b': 1})
>>> c | d # 并集: 汇聚所有的key, key相同的情况下,取大的value
Counter({'c': 5, 'd': 4, 'a': 3, 'b': 2})
常见做法:
sum(c.values()) # 继承自字典的.values()方法返回values的列表,再求和
c.clear() # 继承自字典的.clear()方法,清空counter
list(c) # 返回key组成的list
set(c) # 返回key组成的set
dict(c) # 转化成字典
c.items() # 转化成(元素,计数值)组成的列表
Counter(dict(list_of_pairs)) # 从(元素,计数值)组成的列表转化成Counter
c.most_common()[:-n-1:-1] # 最小n个计数的(元素,计数值)组成的列表
c += Counter() # 利用counter的相加来去除负值和0的值
举个计数的例子,需要统计一个文件中,每个单词出现的次数。实现方法如下:
from collections import *
import re
with open('test.txt') as f:
words=re.findall(r'\w+',f.read().lower())
c=Counter(words)
print(c)