在作文本统计分析的时候,咱们常常会须要进行“计数”这样一个环节。而若是直接使用字典,代码不免会变得复杂。其实, collections 模块中早就给咱们定义好了 Counter 类,它能够很方便地实现计数的功能。python
只须要使用 Counter()
就能够建立一个 Counter 对象了,其中的参数能够有许多种写法:编程
列表 Counter(['apple', 'boy', 'apple'])
app
字典 Counter({'apple':2, 'boy':1})
编程语言
字符串(每个字符视为一个元素) Counter('aabca')
code
关键字形式 Counter(apple=2, boy=1)
对象
接下来以一个小例子对比一下使用普通的字典与 Counter 统计词频的区别。在统计以前,咱们先对文本进行一些处理:字符串
s = 'A boy and a girl' s = s.lower().split()
切分完文本以后,咱们先展现使用普通的字典进行词频统计的方法:it
d = {} for word in s: if word in d: d[word] += 1; else: d[word] = 1; print(d)
{'a': 2, 'boy': 1, 'and': 1, 'girl': 1}
虽然 python 的语法已经比其余编程语言简单很多,可是这样的结构看起来仍是有些繁琐。而若是使用 Counter 对象的话,咱们只须要用一行语句就能够完成:io
c = Counter(s) print(c)
Counter({'a': 2, 'boy': 1, 'and': 1, 'girl': 1})
可见, Counter 的确可以简化咱们对计数的操做。不过除了可以在一开始的统计上简化代码外,它还有许多方便的方法可使用。class
Counter 获取值的方法与字典相似,只须要用 [key]
就能够获取对应的值。不过它与原先的字典不同的是,若是 key
不存在,它不会有 KeyError
的报错,而是会返回 0
。
a = Counter('aabc') print(a['d'])
0
在原先使用字典时,在查找键以前,咱们都须要先进行检验。而使用 Counter 类型就十分方便。
其实, Counter 里面已经实现了对加减号的重载。它能够实现将两个计数器里面的对应值相加或相减。
a = Counter('aabc') b = Counter('bbcd') c = a + b d = a - b print(c) print(d)
这段程序运行的结果以下:
Counter({'b': 3, 'a': 2, 'c': 2, 'd': 1}) Counter({'a': 2})
能够看到,当一个元素的计数被减至0时,它便不会再出现,而不须要单独处理“个数为负”的状况。
不过,若是你想要负的结果,那么你能够选择 subtract()
方法。
a = Counter('aabc') b = Counter('aaaa') a.subtract(b) print(a) print(+a) print(-a)
+a
与 -a
能够返回 Counter 中正的部分与负的部分(不过 -a
返回的负值的相反数)。这一个操做十分经常使用。
Counter({'b': 1, 'c': 1, 'a': -2}) Counter({'b': 1, 'c': 1}) Counter({'a': 2})
词频统计中,咱们每每须要取出最大的几个元素,用于后续的分析。而这项功能, Counter 也帮咱们作好了。咱们只须要调用 most_common(n)
方法,就能够取出 Counter 对象中最多的 n
个元素,并返回一个元组类型。
a = Counter('abracadabra') print(a.most_common(3))
元组内的每个元素都分别是对应的键值,而且已经按照降序排列:
[('a', 5), ('b', 2), ('r', 2)]
仅仅一行,咱们就能够获取 Counter 计数器中最多的几项了,这极大的简化了咱们的代码量。
上面的介绍展现了 Counter 计数器的经常使用方法。其实在了解它以前,我一直都是用字典作词频统计,所以也更发现 Counter 计数器在这一类问题上的简便性。你们也能够尝试一下本身用字典实现这一些功能,这样便可以更好地理解 Counter 的工做原理。