在很多场景中经常会用到统计计数的需求,比如在实现 kNN 算法时统计 k 个标签值的个数,进而找出标签个数最多的标签值作为最终 kNN 算法的预测结果。Python内建的 collections 集合模块中的 Counter 类能够简洁、高效的实现统计计数。

Counter 是 dict 字典的子类,Counter 拥有类似字典的 key 键和 value 值,只不过 Counter 中的键为待计数的元素,而 value 值为对应元素出现的次数 count,为了方便介绍统一使用元素和 count 计数来表示。虽然 Counter 中的 count 表示的是计数,但是 Counter 允许 count 的值为 0 或者负值。

1. 实例化 Counter 类

如果要使用 Counter,必须要进行实例化,在实例化的同时可以为构造函数传入参数来指定不同类型的元素来源。

from collections import Counter# 实例化元素为空的 Counter 对象
a = Counter()# 从可迭代对象中实例化 Counter 对象
b = Counter('chenkc')# 从 mapping 中实例化 Counter 对象
c = Counter({'a':1, 'b':2, 'c':3})# 从关键词参数中实例化 Counter 对象
d = Counter(a = 1, b = 2, c = 3)
  • 实例化元素为空的 Counter 对象,之后可以通过为字典添加元素的方式为 Counter 对象添加元素。
from collections import Counter# 实例化元素为空的 Counter
a = Counter()
# 为 Counter 添加元素以及对应的 count 计数
a['a'] = 1
a['b'] = 2
a['c'] = 3>>> print(a)
Counter({'c': 3, 'b': 2, 'a': 1})
  • 从 string(字符为list列表的元素)、list 和 tuple 这些可迭代对象中获取元素。
from collections import Counter# 从可迭代对象中实例化 Counter
b = Counter("chenkc") # string
b2 = Counter(['c', 'h', 'e', 'n', 'k', 'c']) # list
b3 = Counter(('c', 'h', 'e', 'n', 'k', 'c')) # tuple>>> print(b)
Counter({'c': 2, 'h': 1, 'e': 1, 'n': 1, 'k': 1})
>>> print(b2)
Counter({'c': 2, 'h': 1, 'e': 1, 'n': 1, 'k': 1})
>>> print(b3)
Counter({'c': 2, 'h': 1, 'e': 1, 'n': 1, 'k': 1})
  • 从 mapping 中实例化 Counter 对象,mapping 类型的数据就是元素为(x, y)的列表,字典也属于 mapping 类型的数据。
from collections import Counter# 从 mapping 中实例化 Counter 对象
c = Counter([('a', 1), ('b', 2), ('a', 3), ('c', 3)])
c2 = Counter({'a':1, 'b':2, 'a':3, 'c':3}) # 字典>>> print(c)
Counter({('a', 1): 1, ('b', 2): 1, ('a', 3): 1, ('c', 3): 1})
>>> print(c2)
Counter({'a': 3, 'c': 3, 'b': 2})

虽然传入的 mapping 类型的数据是一样的,但是由于字典中的键是唯一的,因此如果字典中的键重复会保留最后一个

dic = {'a':1, 'b':2, 'a':3, 'c':3}>>> print(dic)
{'a': 3, 'b': 2, 'c': 3}
  • 从关键词参数中实例化 Counter 对象,关键词参数中指定的关键词必须是唯一的,但是不同于字典,如果指定的关键词重复,程序会抛出SyntaxError异常。
from collections import Counter# 从关键词参数中实例化 Counter 对象
d = Counter(a = 1, b = 2, c = 3)
# d2 = Counter(a = 1, b = 2, a = 3, c = 3) # SyntaxError>>> print(d)
Counter({'c': 3, 'b': 2, 'a': 1})

我们都知道在字典中查找不存在的键,程序会抛出 KyeError的异常,但是由于 Counter 用于统计计数,因此 Counter 不同于字典,**如果在 Counter 中查找一个不存在的元素,不会产生异常,而是会返回 0,这其实很好理解,Counter 计数将不存在元素的 count 值设置为 0 **。

from collections import Counterc = Counter({'a':1, 'b':2, 'c':3})>>> print(c['d']) # 查找键值为'd'对应的计数
0
>>> print(c)
Counter({'c': 3, 'b': 2, 'a': 1})

c['d']表示的查找返回元素值为d的 count 计数,而如果使用c['d'] = 0则表示的是为 Counter 添加元素。

from collections import Counterc = Counter({'a':1, 'b':2, 'c':3})
c['d'] = 4 # 为 Counter 添加元素>>> print(c['d'])
4
>>> print(c)
Counter({'d': 4, 'c': 3, 'b': 2, 'a': 1})

2. Counter 中的方法

实例化 Counter 类对象之后,就可以使用 Counter 对象中的方法。由于 Counter 类继承自 dict 类,所以 Counter 类可以使用 dict 类的方法。下面分别从 Counter 所特有的方法和一些字典的常规方法来介绍。

2.1 Counter 特有的方法

Counter 额外支持字典中没有的三个方法:elements()most_common([m])以及subtract([iterable-or-mapping])

  • elements 方法

elements()方法返回一个迭代器,可以通过 list 或者其它方法将迭代器中的元素输出,输出的结果为对应出现次数的元素。

from collections import Counterc = Counter({'a':1, 'b':2, 'c':3})
c2 = Counter({'a':0, 'b':-1, 'c':3}) # 将出现次数设置为 0 和负值>>> print(c.elements())
<itertools.chain object at 0x0000022A57509B70>
>>> print(list(c.elements()))
['a', 'b', 'b', 'c', 'c', 'c'] >>> print(c2.elements())
<itertools.chain object at 0x0000022A57509B70>
>>> print(list(c2.elements()))
['c', 'c', 'c']

在 Counter 中是允许计数为 0 或者负值的,不过通过上面代码可以看出 elements 函数没有将 0 和负值对应的元素值打印出来

  • most_common 方法

most_common([n])是 Counter 最常用的方法,返回一个出现次数从大到小的前 n 个元素的列表。

from collections import Counterc = Counter({'a':1, 'b':2, 'c':3})>>> print(c.most_common()) # 默认参数
[('c', 3), ('b', 2), ('a', 1)]
>>> print(c.most_common(2)) # n = 2[('c', 3), ('b', 2)]
>>> print(c.most_common(3)) # n = 3
[('c', 3), ('b', 2), ('a', 1)]
>>> print(c.most_common(-1)) # n = -1
[]

n为可选参数,通过上面的代码可以总结出:

  1. 不输入n,默认返回所有;
  2. 输入n小于最长长度,则返回前n个数;
  3. 输入n等于最长长度,则返回所有;
  4. 输入n = -1,则返回空;
  • subtract 方法

subtract([iterable_or_mapping])方法其实就是将两个 Counter 对象中的元素对应的计数相减。

from collections import Counterc = Counter({'a':1, 'b':2, 'c':3})
d = Counter({'a':1, 'b':3, 'c':2, 'd':2})
c.subtract(d)>>> print(c)
Counter({'c': 1, 'a': 0, 'b': -1, 'd': -2})

其实就是两个 Counter 中的对应的元素的计数相减。当其中某个 Counter 中对应的元素不存在的时候,默认将其计数设置为 0,这也是为什么'd'的计数为-2的原因。

2.2 Counter 支持的字典方法

一般常规的字典方法对 Counter 对象都是有效的,将这些字典方法作用到下面的 Counter 对象c中,并绘制到下面的表格中。

from collections import Counterc = Counter({'a':1, 'b':2, 'c':3, 'd':0, 'e':-1})

但是在 Counter 中有两个方法和字典中的使用有些区别:

from collections import Counterc = Counter({'a':1, 'b':2, 'c':3, 'd':0, 'e':-1})c.update({'a':2, 'd':2, 'e':1})>>> print(c)
Counter({'a': 3, 'c': 3, 'b': 2, 'd': 2, 'e': 0})

对于 Counter 中的update函数简单来说,就是增加对应元素的计数。

2.3 集合运算符

这里直接贴出集合运算符的代码示例。

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

原文地址:
Python中的计数 - Counter类
References:
Python collections中的Counter作用以及源码分析

Python中的Counter类相关推荐

  1. Python输入一个字符串,输出其中每个字符的出现次数。要求使用标准库collotections中的Counter类...

    一.题目: 1.输入一个字符串,输出其中每个字符的出现次数.要求使用标准库collotections中的Counter类. 2.输入一个字符串,输出其中只出现了一次的字符及其下标. 3.输入一个字符串 ...

  2. python中的counter()、elements()、most_common()和subtract()函数的用法

    python中的counter().elements().most_common()和subtract()函数的用法 counter()方法: class collections.Counter([i ...

  3. Python中的元类是什么?

    元类是什么,我们将它们用于什么? #1楼 请注意,此答案适用于2008年编写的Python 2.x,元类在3.x中略有不同. 元类是使"类"工作的秘诀. 新样式对象的默认元类称为& ...

  4. python创建类的实例方法-Python中动态创建类实例的方法

    简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模 ...

  5. python中采用字典建立统,Python中使用Counter进行字典创建以及key数量统计的方法...

    这里的Counter是指collections中的Counter,通过Counter可以实现字典的创建以及字典key出现频次的统计.然而,使用的时候还是有一点需要注意的小事项. 使用Counter创建 ...

  6. python中若干关于类的问题

    文章目录 前言 类的构造 类的方法 前言 本文介绍python中若干关于类的难题,这些问题或者概念竟然让人无法理解或者混淆.因而记录下来,若想到新的会继续更新. 类的构造 我们只知道__init__( ...

  7. python叫什么-python中什么叫类

    python中什么叫类? 可以视为种类或者类型的同义词.所有的对象都属于某一个类,称为类的实例. 例如:鸟就是"鸟类"的实例.这就是一个有很多子类的一般(抽象)类:看到的鸟可能属于 ...

  8. python简介怎么写-python中如何写类

    类的定义 Python中,定义类是通过class关键字,例如我们定义一个存储学生信息的类: class Student(object): pass class后面紧接着是类名,即Student,类名通 ...

  9. python中的定制类(转载)

    python中的定制类(转载)<?xml version="1.0" encoding="UTF-8"?> 看到类似__slots__这种形如__x ...

  10. Python中的元类及元类实现的单例模式

    https://www.cnblogs.com/tkqasn/p/6524879.html 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元 ...

最新文章

  1. Linux shell 中的数组和关联数组
  2. 笔记:写Java程序,并输出
  3. 《R语言游戏数据分析与挖掘》一导读
  4. [SQL Server]无法创建 SSIS 运行时对象,请验证 DTS.dll 是否可用及是否已注册
  5. Cookie和Session的作用,区别和各自的应用范围,Session工作原理
  6. mysql练习用的数据集下载(转载+自己补充步骤)
  7. backbone源码之factory
  8. 关于windows上的exe可执行程序在黑色窗口运行时候不能点击屏幕,要不然会暂定程序
  9. 智林STM32程序源代码的分析和整理03(转帖)
  10. 红外线遥控c语言程序,红外线遥控解码接收程序-c语言讲解学习.pdf
  11. kde重启_重启崩溃的 KDE
  12. 利用中继攻击解锁并开走汽车,本田不打算修复(含视频)
  13. ERP生产管理系统源码
  14. VS2012 Npcap使用
  15. matlab中的sprintf函数,Matlab中disp和sprintf函数使用方法和区别介绍
  16. 【无标题】公众号引流进阶教程(公众号对接电影,影视资源)
  17. 嵌入式开发日记(6)——对串口数据读取的优化以及处理程序的改写
  18. 开发用于异构环境的可生存云多机器人框架
  19. 关于上传资源的最新公告
  20. 动手学数据分析-数据可视化

热门文章

  1. java咖啡机_JAVA咖啡机2010款
  2. 入门力扣自学笔记180 C++ (题目编号:886)(涂色问题,可以多看看)
  3. wav格式怎么转换成mp3
  4. php强行横屏,强制横屏app
  5. 快讯|万博智云HyperMotion云迁移产品在华夏云网云市场上线了
  6. CocosCreator快速接入bugly
  7. FRM P1B3笔记:Introduction to Financial Markets and Products
  8. 国际抗疫数据分析脚本
  9. 电源输出端串入IN4007,测量正负电压,压降只有0.3v,为什么不是0.7v左右呢?
  10. JSLint中常见报错提示