python中扑克牌类设计_Python中的计数 Counter类

26bcee91be1047595eaa80f73c0e21e1.png

点击上方"AI机器学习与深度学习算法",选择"星标"公众号

原创干货,第一时间送达

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

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

实例化 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})

1219e88d2bea096d2f38afee9023ae18.png

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

from collections import Counter

c = 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 Counter

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

Counter 中的方法

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

Counter 特有的方法

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

  • elements 方法

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

from collections import Counter

c = Counter({'a':1, 'b':2, 'c':3})
c2 = Counter({'a':0, 'b':-1, 'c':3}) # 将出现次数设置为 0 和负值

>>> print(c.elements())
0x0000022A57509B70> >>> print(list(c.elements()))
['a', 'b', 'b', 'c', 'c', 'c'] >>> print(c2.elements())0x0000022A57509B70> >>> print(list(c2.elements()))
['c', 'c', 'c']

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

  • most_common 方法

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

from collections import Counter

c = 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 Counter

c = 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的原因。

Counter 支持的字典方法

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

from collections import Counter

c = Counter({'a':1, 'b':2, 'c':3, 'd':0, 'e':-1})
方法描述结果
c.values()列出所有的元素的计数dict_values([1, 2, 3, 0, -1])
c.clear()清空所有元素Counter() # 元素为空的 Counter
list(c)列出所有不唯一的元素['a', 'b', 'c', 'd', 'e']
set(c)转换成集合{'d', 'b', 'c', 'a', 'e'}
dict(c)转换成字典{'a': 1, 'b': 2, 'c': 3, 'd': 0, 'e': -1}
c.items()转换成dict_items,其中的元素为(key, vlaue)dict_items([('a', 1), ('b', 2), ('c', 3), ('d', 0), ('e', -1)])
c.most_common()[:-n-1:-1]n 个出现次数最小的元素[('e', -1), ('d', 0)] # 当 n = 2 时
c += Counter()删除掉计数为 0 和复数的元素Counter({'c': 3, 'b': 2, 'a': 1})

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

异常方法描述
fromkeys(iterable)没有为 Counter 对象实现该函数
update([iterable-or-mapping])增加 count 而不是用新的 count 取代旧的 count
from collections import Counter

c = 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函数简单来说,就是增加对应元素的计数。

集合运算符

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

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

参考:

  1. https://blog.csdn.net/Shiroh_ms08/article/details/52653385

1725226342795a224619d550b71c0d1d.png

推荐阅读

(点击标题可跳转阅读)

【自然语言处理】带你理解语言模型

【自然语言处理】通俗理解n-gram语言模型

【自然语言处理】通俗讲解语言模型的评价指标-困惑度

【Python语言】轻松搞懂Python中Iterable与Iterator

【机器学习】一文搞懂简单线性回归

【深度学习】详解Softmax函数

【技术干货】本地远程访问Linux服务器上的jupyter notebook

【数据分析】Numpy中常用随机函数的总结

556da94f5cd4b8aa9ca2b7c09c703b5b.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机多文件管理,电脑文件管理几条小技巧

电脑文件管理几条小技巧在电脑的内部,在电脑的桌面上,在“资源管理器”中,充斥着无序与混乱,这种虚拟的混乱极大地影响了电脑的性能和我们办公的效率,下面小编为大家带来了电脑文件管理几条小技巧,希望对大家有用。电脑…

python读取excel画散点图对应多个y_Python Scatter Plot,每个X都有多个Y值

How can I plot different numbers of Y values for each X value 只需分别绘制每个组: for xe, ye in zip(x, y): plt.scatter([xe] * len(ye), ye) and how can I change the X axis from being the numbers 1 and 2 to text categories “cat1” and “cat2”. 手…

追加10亿!腾讯宣布设立15亿元“战疫基金”

来源:腾讯刚刚,腾讯宣布设立15亿元“抗击新型冠状病毒感染肺炎疫情综合保障基金”(以下简称战疫基金)。这是腾讯在设立首期3亿元疫情防控基金、2亿元战疫开发者公益联盟资金池后,再次升级追加10亿元基金,为…

equals null报错吗_轻轻松松教你搞定Java中的==和equals

前言相信很多读者关于和equals懂了又懵,懵了又懂,如此循环,事实上可能是因为看到的博客文章之类的太多了,长篇大论,加上一段时间的洗礼之后就迷路了。本篇文章再一次理清楚。当然如果觉得本文太啰嗦的话,当…

java八股 spring + mybatis

Spring常用注解(绝对经典)_spring注解-CSDN博客 框架篇-02-Spring-单例bean是线程安全的吗_哔哩哔哩_bilibili 1.spring.bean 单例 线程不安全 2.AOP 项目里可以说记录用户登录日志,利用request去获取姓名、ip、、请求方式、url&#xff0…

服务器数据库2008怎么备份数据库文件,怎么备份SQL Server2008数据库

在使用SQL Server 2008服务器的时候,我们需要定时的备份数据库来防止数据的丢失,下面学习啦小编为大家介绍备份SQL Server 2008数据库的方法。备份SQL Server 2008数据库的方法在开始菜单中点击“SQL Server Management Studio”在弹出的界面点击连接&am…

蝙蝠为啥这么厉害?地球人整明白了没有?

来源:周末八点半公元一世纪的时候,希腊的普鲁塔克提出了一个问题:如果忒修斯船上的零件被逐渐替换,直到所有的零件都不是原来的零件,那么这艘船还是原来的那艘船吗?这就是人类历史上的忒修斯悖论&#xff0…

vant input框禁止调用手机键盘_春运不要变“泰囧”手机这些功能让回家的路更安全...

随着春节的临近,年味儿可以说是越来越浓了,比如刚刚开始的支付宝集五福活动激发了大家的参与热情,而每年都会上热搜的春运更是成为了我国人民过年最真实的写照。就拿小编来说,作为一个张家口的北漂人,前几天京张高铁的…

math python 向上取整_Python成为专业人士笔记-各数学运算操作深度剖析

“专业人士笔记”系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.comPython可以执行常见的数学运算符,包括整数和浮点除法、乘法、取幂、加法和减法,而数学math模块…

css3 shapes是什么意思,如何在Web中使用CSS Shapes

布局一般都是遵循按行和列等线性原则,Web网站的布局到今天为止很大程度上受到这些原则的影响。虽然CSS Grid的出现让布局变得更好,更灵活,但相对于印刷媒体而言,Web布局总体上还是受到很好的限制,特别是内容流上。杂志…

wps临时文件不自动删除_电脑:让 Windows 10 系统自动清理临时文件

不少朋友在系统用久了以后,都会用一些软件来帮忙清理系统中没用的文件,其中包括一些临时文件、无用文件等。但其实在 Windows 10 中,系统已经内置了自动定期清理临时文件的功能了。你还不知道?跟着我们来学习下吧。这个功能就隐藏…

服务器系统gho系统怎么安装系统,GHOST怎么重装系统?GHO文件安装系统教程

ghost映像文件就是系统文件,通过gho文件我们可以就进行系统的重装。不过对于电脑小白来说,不知道在哪里可以下载纯净的ghost文件,下载完成后也不清楚如何使用gho文件安装系统。那么下面就让小编教大家使用gho文件重装系统。相关教程&#xff…

Science | 谷岩/王朗团队揭示大脑中的免疫细胞竟是记忆遗忘的“主谋”

来源:BioArt记忆是大脑最重要的功能之一,也是人类研究最多的脑功能之一。记忆随时在发生,而遗忘如影随形。海马体位于大脑丘脑和内侧颞叶之间,是负责记忆的编码和存储的一个重要脑区。在这里,记忆信息被编码于一些神经…

基于深层卷积网络的手写数字识别 minist_「Tensorflow」基于CNN的数字OCR识别

导读 对于人类来说,识别手写的数字是一件非常容易的事情。我们甚至不用思考,就可以看出下面的数字分别是1,2,3。那机器如何来识别数字?本期将使用Tensorflow搭建卷积神经网络,进行手写数字的识别。代码可关…

2019年5G创新深度研究报告

来源:中信建投从历史上看,每一轮科技产业创新周期均主要由通信代际升级驱动,历时 5-8 年。我们认为 2017-2019 年为 4G 时代的稳定成熟期,而进入 2020 年,运营商加速投入 5G 网络建设,科技软硬件有望在运营…

鹰眼系统原理_山东首家露天焚烧鹰眼监控系统在我镇投入使用

露天冒烟着火,不用人员到现场,电子围栏就会锁定目标,自动报警,提醒监管人员立即现场处置。日前,莱西市院上镇新安装建设的污染源鹰眼监控系统投入使用,实现了环境监控全方位、自动化。据了解,这…

机器人的工作原理,这是我见过最详细的解析!

来源:网络很多人一听到“机器人”这三个字脑中就会浮现“外形酷炫”、“功能强大”、“高端”等这些词,认为机器人就和科幻电影里的“终结者”一样高端炫酷。其实不然,在本文中,我们将探讨机器人学的基本概念,并了解机…

linux mint 图标主题_如何在 Linux Mint 中更换主题

一直以来,使用 Cinnamon 桌面环境的 Linux Mint 都是一种卓越的体验。这也是为何我喜爱 Linux Mint的主要原因之一。-- Its Foss(作者)一直以来,使用 Cinnamon 桌面环境的 Linux Mint 都是一种卓越的体验。这也是为何我喜爱 Linux…

服务器物品展示框刷物品,我的世界1period;11period;2展示框刷物品bug | 手游网游页游攻略大全...

发布时间:2017-09-25我的世界惊现全新无限刷物品bug 服主大大都要注意了.那今天给大家分享一个玩家无意间发现的新的无限刷物品bug,而且还是在服务器中哦!那感兴趣的玩家不妨进来看看哦! 在一个rpg服务器玩 开小号召唤boss的时候发现的. ...标签:我的世界…

Nature:揭示人大脑类器官为何缺乏正常人脑特有的细胞亚型和复杂回路

来源:生物谷作为在实验室中通常利用人类干细胞培育出的大脑样组织三维球体,大脑类器官被吹捧为有潜力让科学家们在受控的实验室条件下研究大脑回路的形成。关于大脑类器官的讨论非常热闹,一些科学家认为它们将使得快速开发针对破坏性的脑部疾…