Python的标准库collections中有很多魔法函数,可以使平时的数据处理非常高效,今天介绍一个很好用的计数函数——Counter。
Counter函数的功能主要是计数器,特别是在对源数据是字典类型的数据进行计数时,如果不想写冗长繁琐的for循环,那么使用Counter函数将是一个不错的选择。
这里以一个简单的计数场景来演示,假设我们有一组以颜色名称和颜色数量为键值对的字典对象,我们需要对同一种颜色进行累计计数(字典中可能有多组同一颜色的键值对),看起来似乎只能使用笨笨的循环来进行操作了。
colors = [{'red':4},{'blue':5},{'red':8},{'green':7},{'blue':8},{'blue':10},{'green':12}]
方法一——使用比较传统的循环方法:
result = {}
for i in colors:
if list(i.keys())[0] not in result:
result[list(i.keys())[0]] = list(i.values())[0]
else:
result[list(i.keys())[0]] += list(i.values())[0]
{'red': 12, 'blue': 23, 'green': 19}
如果这里使用collections标准库中的Counter函数,则整个过程会无比简单:
方法二——Counter函数:
from collections import Counter
c = Counter()
for i in colors:
c[list(i.keys())[0]] += list(i.values())[0]
Counter({'blue': 23, 'green': 19, 'red': 12})
这里Counter容器实现了一个自动化的计数器,当Counter中不存在某个键时,赋值操作会自动创建一个新的键,而不是像方法一中那样需要手动去判断某个键是否已经存在在字典里面。
除此之外,Counter神奇的地方在于它有很多可以简单调用的统计方法,比如我们想要获取结果中正序/倒序的TOPN记录,则可以直接这样写:
c.most_common(2)[('blue', 23), ('green', 19)]
当对数量巨大、且重复记录多的字典对象进行汇总计数操作时,Counter函数能够非常方便、高效的胜任此项工作。