[python][collections] Counter 计数器

在作文本统计分析的时候,咱们常常会须要进行“计数”这样一个环节。而若是直接使用字典,代码不免会变得复杂。其实, collections 模块中早就给咱们定义好了 Counter 类,它能够很方便地实现计数的功能。python

1. 建立一个 Counter 对象

只须要使用 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

2. 获取对应键的值

Counter 获取值的方法与字典相似,只须要用 [key] 就能够获取对应的值。不过它与原先的字典不同的是,若是 key 不存在,它不会有 KeyError 的报错,而是会返回 0

a = Counter('aabc')
print(a['d'])
0

在原先使用字典时,在查找键以前,咱们都须要先进行检验。而使用 Counter 类型就十分方便。

3. 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})

4. most_common() - 取出最多的 n 个元素

词频统计中,咱们每每须要取出最大的几个元素,用于后续的分析。而这项功能, Counter 也帮咱们作好了。咱们只须要调用 most_common(n) 方法,就能够取出 Counter 对象中最多的 n 个元素,并返回一个元组类型。

a = Counter('abracadabra')
print(a.most_common(3))

元组内的每个元素都分别是对应的键值,而且已经按照降序排列:

[('a', 5), ('b', 2), ('r', 2)]

仅仅一行,咱们就能够获取 Counter 计数器中最多的几项了,这极大的简化了咱们的代码量。

总结

上面的介绍展现了 Counter 计数器的经常使用方法。其实在了解它以前,我一直都是用字典作词频统计,所以也更发现 Counter 计数器在这一类问题上的简便性。你们也能够尝试一下本身用字典实现这一些功能,这样便可以更好地理解 Counter 的工做原理。

相关文章
相关标签/搜索