【转载】Python中collection.Counter的用法

目录

前言

正文

初始化Counter对象的方法

关于在Counter对象中计数为0的情况

Counter对象支持的方法

elements()

most_common([n])

subtract([iterable-or-mapping])

update([iterable-or-mapping])

Counter对象的常见操作

总结


前言

首先Counter这个工具能够用来让我们快速便捷的对某些对象做一些统计操作,包括可迭代对象iterable和映射对象mappings

正文

语法:collections.Counter([iterable-or-mapping])

注解:
A Counter is a dict subclass for counting hashable objects. It is an unordered collection where elements are stored as dictionary keys and their counts are stored as dictionary values. Counts are allowed to be any integer value including zero or negative counts.

个人理解:Counter对象是字典的一个子类,它一般被用来去为可哈希的对象计数,并且,最终计数的结果是以可迭代对象和映射对象的元素为键key,以这些元素的出现次数为值value形成的无序集合。特别地,这些元素对应的值可以为0或者负数

案例:

初始化Counter对象的方法

# 1、创建一个空的Counter对象
from collections import Counter  
c = Counter()
print(c)

# 结果显示:  
Counter()  

# 2、使用可迭代对象初始化Counter对象  
c = Counter('gallahad')
print(c)

# 结果显示:  
Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1})  

# 3、使用映射对象初始化Counter对象  
c = Counter({'red': 4, 'blue': 2})
print(c)

# 结果显示:  
Counter({'red': 4, 'blue': 2})  

# 4、使用关键字参数初始化Counter对象  
c = Counter(cats=4, dogs=8)
print(c)

# 结果显示:  
Counter({'dogs': 8, 'cats': 4})  

关于在Counter对象中计数为0的情况

获取Counter对象中不存在的元素的值value,不会报错KeyError,而是返回0

c = Counter(['eggs', 'ham'])
print(c['bacon'])  

# 结果显示:  
0  

同理:如果给Counter对象中的某个元素赋值为0,并不意味着这个元素被删除了,如果想删除Counter中的某个元素,使用del

c['sausage'] = 0  
print(c)  

# 显示结果:  
Counter({'eggs': 1, 'ham': 1, 'sausage': 0})  

del c['sausage']  
print(c)  

# 显示结果:  
Counter({'eggs': 1, 'ham': 1})  

Counter对象支持的方法

elements()

这个方法返回一个迭代器,这个迭代器包含了Couter对象包含的所有元素,并以它们的计数来决定它们在这个迭代器中出现多少次,而且元素的顺序是随机的。特别地,如果元素的计数小于1,那么elements()方法会忽略这个元素:

c = Counter(a=4, b=2, c=0, d=-2)  
print(sorted(c.elements()))  

# 结果显示:  
['a', 'a', 'a', 'a', 'b', 'b']  

most_common([n])

这个方法返回一个列表,里面的元素都是以元组的形式存在,元组里的元素分别是原先Counter对象中的键值对,并且是按照元素的值的大小来决定它们的顺序(默认从大到小)。如果在使用时传入了参数n,那么返回的结果是选取列表中的前n个元素,如果没有传入参数或者传入的参数为0,那么默认是返回所有的元素。如果有多个元素的值相同,那么它们之间的顺序是随机的:

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

# 结果显示:  
[('a', 5), ('b', 2), ('r', 2)]   

subtract([iterable-or-mapping])

这个方法返回的还是一个Counter对象,结果是用方法的调用者Counter对象里面元素的个数减去对应的另外一个Counter对象中元素的个数得到的差,为新的Counter对象中元素的值value

c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4, e=5)
c.subtract(d)
print(c)  

# 结果显示:  
Counter({'a': 3, 'b': 0, 'c': -3, 'e': -5, 'd': -6})  

update([iterable-or-mapping])

这个方法类似于字典的update()方法,对于原来的Counter对象中没有的元素,则将此元素和它对应的计数添加进来,已有的元素则只是在原来的计数上加上此元素的计数:

c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4, e=5)  
c.update(d)  
print(c)  

# 结果显示:  
Counter({'a': 5, 'e': 5, 'b': 4, 'c': 3, 'd': 2})  

Counter对象的常见操作

sum(c.values())                 # 统计所有元素的个数
c.clear()                       # 清空Counter对象里面的所有元素
list(c)                         # 以列表的形式展现Counter对象的所有键key
set(c)                          # 以集合的形式展现Counter对象的所有键key
dict(c)                         # 将Counter对象转换成字典
c.items()                       # 转换成包含类似(elem, cnt)元素的列表 
Counter(dict(list_of_pairs))    # 将一个包含类似(elem, cnt)元素的列表转换成Counter对象
c.most_common()[:-n-1:-1]       # 找出数量最少的n个元素
+c                              # 将数量为0或负数的键值对给移除   
-c                              # 将数量为0或正数的键值对给移除,并将数量为负数的元素变成整数

Counter对象的类似集合的操作

>>> c = Counter(a=3, b=1)
>>> d = Counter(a=1, b=2)
>>> c + d                       # 相同元素数量相加,没有的则作为新的元素
Counter({'a': 4, 'b': 3})
>>> c - d                       # 相减,只保留最后value值为正的元素
Counter({'a': 2})
>>> c & d                       # 相交,只保留相同的元素和最小的value值
Counter({'a': 1, 'b': 1})
>>> c | d                       # 合并,保留相同元素和最大的value值,包含不相同的元素
Counter({'a': 3, 'b': 2})

总结

总之,Counter对象的主要功能为快速计算相同元素的个数,并且能够进行高效的更新。
如果想要查看更加详细的内容,请移步官网:https://docs.python.org/3.6/library/collections.html

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值