Python测试常用库collections之counter计数器

collections是python的标准库,它提供了一些解决特定问题的容器,也就是说有些问题虽然可以用list,tuple,dict解决,但解决起来太麻烦,而这些问题又经常遇到,所以他们就把这些问题的通用方法整理了出来,放到collections库中让人使用。

collections中一共有9种容器,其中counter、defaultdict、deque、namedtuple、orderdict比较常用。

方法作用
namedtuple()创建命名元组子类的工厂函数
deque类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)
ChainMap类似字典(dict)的容器类,将多个映射集合到一个视图里面
Counter字典的子类,提供了可哈希对象的计数功能
OrderedDict字典的子类,保存了他们被添加的顺序
defaultdict字典的子类,提供了一个工厂函数,为字典查询提供一个默认值
UserDict封装了字典对象,简化了字典子类化
UserList封装了列表对象,简化了列表子类化
UserString封装了列表对象,简化了字符串子类化

一,先说 counter 计数器

既然是解决特定问题的容器,那它解决什么问题呢?

嗯,它是统计每个值出现的次数,比如字符串“qwewqasdad”,让你统计q出现了几次,我们一般的思路是什么?

迭代,判断有没有相同的,有相同的对应的字典值加1,没有相同的对应的字典值为1。

很麻烦,如果知道了Counter就很容易得出结论了。

1,导入

from collections import Counter

2,看看它支持哪些构造函数

# 空
em = Counter()
# 字符串
s = Counter("111112222wwwwdddd")
# list
ls = [i for i in "qwqwqwqw12132323"]
l = Counter(ls)
# tuple
tp = (i for i in "qwqwqw")
t = Counter(tp)
# dict
dt = {k: randint(1, 4) for k in "asdfghjkl"}
d = Counter(dt)
# 关键字参数
kw = Counter(a=12, b=34)

---------------------
Counter()
---------字符串---------
Counter({'1': 5, '2': 4, 'w': 4, 'd': 4})
---------list-----------
Counter({'q': 4, 'w': 4, '2': 3, '3': 3, '1': 2})
---------tuple-----------
Counter({'q': 3, 'w': 3})
---------dict-----------
Counter({'s': 4, 'h': 4, 'l': 3, 'f': 2, 'g': 2, 'j': 2, 'k': 2, 'a': 1, 'd': 1})
---------关键字参数-----
Counter({'b': 34, 'a': 12})

看来常用的字符串,列表,元组,字典都支持。

3,常用方法

most_common(n) 找出重复次数最多的前n个

ls = [i for i in "qwqqwqwqw12132323"]
l = Counter(ls)
print(l) 
print(l.most_common(2))

结果
Counter({'q': 5, 'w': 4, '2': 3, '3': 3, '1': 2})
[('q', 5), ('w', 4)]

从结果可以很明显的看出 lc 中,q重复了5次,w重复了4次等等,调用most_common()就可以直接将前几个重复的单词找出来。

elements()是将它拆分开。

ls = [i for i in "qwqqwqwqw12132323"]
lc = Counter(ls)
print(list(l.elements()))

结果
['q', 'q', 'q', 'q', 'q', 'w', 'w', 'w', 'w', '1', '1', '2', '2', '2', '3', '3', '3']

可以看出它把lc全部摊开了,q有多少个就显示多少个,w有多个就显示多少个。

要是看lc中某个值重复了多少次,怎么看呢?它为我们提供了和dict一样的方式。

ls = [i for i in "qwqqwqwqw12132323"]
lc = Counter(ls)
print(lc)
print(lc['q'])
print(lc['w'])
print(lc['b'])

结果
Counter({'q': 5, 'w': 4, '2': 3, '3': 3, '1': 2})
5
4
0

如果没有的话就返回 0 ,如了lc[b]

还有一个常用的方法,itmes(),和dict一样的用法,将数值和出现的次数以元组的形式存放在一起,然后以list的形式统一组合起来

ls = [i for i in "qwqqwqwqw12132323"]
l = Counter(ls)
print(l)
print(l.items())
for k,v in l.items():
    print(k,v)
    
结果:
dict_items([('q', 5), ('w', 4), ('1', 2), ('2', 3), ('3', 3)])
q 5
w 4
1 2
2 3
3 3

还有其他方法如 update()增加元素,subtract减少元素等

最常用到的还是most_common(),面试的时候被问到几次!

下一篇 Python常用库collections之namedtuple

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值