collections是Python中的一种数据类型(结构),Python官方文档中将其描述为:
High-performance container datatypes(高性能容器数据类型)
collections中包含了以下内容:
1.namedtuple(): 生成可以使用名字来访问元素内容的tuple子类
2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
3.Counter: 计数器,主要用来计数
4.OrderedDict: 有序字典
5.defaultdict: 带有默认值的字典
注意:collections为Python内置模块,不需要单独安装,直接 import 即可使用
这里我们将对collections.Counter()进行一些简单的介绍和用例展示。
从语义上来看,collections.Counter()可以看成是一个计数器,它可以的对象包括元组(tuple)、字符串(str)、数组(array)、列表(list)等,并提供了很多方便快捷的操作运算。
用字符串初始化Counter
from collections import Counter
a = Counter('aaasdfhasdfbnvf')
print(a)
print(type(a))
fruit = Counter(['apple','orange','pear','apple','orange','apple'])
print(fruit)
输出结果 Counter({'apple': 3, 'orange': 2, 'pear': 1})
可以看到Counter对象的存储数据与字典相似(事实上,collections为dict的一个子类),通过key-value的方式存储,其中key为出现的数据单元,value为出现次数(Counter本身作为统计、计数的操作)
Counter可以直接通过key值访问数据,获得对应的value,当key在Counter中不存在时,返回0
>>>a['a']
4
>>>a['n']
1
>>>a[0]
0
列出所有的键值(并排序)
>>>a.keys()
dict_keys(['a', 's', 'd', 'f', 'h', 'b', 'n', 'v'])
>>>sorted(a)
['a', 'b', 'd', 'f', 'h', 'n', 's', 'v']
获取出现次数最高的三个字母(词频统计)
>>>a.most_common(3)
[('a', 4), ('f', 3), ('s', 2)]
更新Counter数据信息
>>>a['a'] = 12
>>>a
Counter({'a': 12, 's': 2, 'd': 2, 'f': 3, 'h': 1, 'b': 1, 'n': 1, 'v': 1})
>>>for e in "ahdfiahf":
>>> a[e] = a[e] - 1
>>>a
Counter({'a': 10,
's': 2,
'd': 1,
'f': 1,
'h': -1,
'b': 1,
'n': 1,
'v': 1,
'i': -1})
>>>a['h']
-1
前面我们可以看到当某一个元素不存在于Counter中时,我们通过该元素key的形式访问得到的结果是0,另一方面当我们把本来存在于Counter中的元素的value减至0(或者直接赋值为),我们再次访问这个key时,结果同样为0;因此当访问一个元素的value返回结果为0时,存在两种可能,值本身为0或不存在。
>>>a
Counter({'a': 10,'s': 2,'d': 1,'f': 1,'h': -1,'b': 1,'n': 1,'v': 1,'i': -1})
>>>a['s'] = 0
>>>a
Counter({'a': 10,'s': 0,'d': 1,'f': 1,'h': -1,'b': 1,'n': 1,'v': 1,'i': -1})
>>>del a['s']
>>>a
Counter({'a': 10, 'd': 1, 'f': 1, 'h': -1, 'b': 1, 'n': 1, 'v': 1, 'i': -1})
通过上面的例子,我们可以清楚地看到将元素赋值为0和删除元素对象的区别,前者只是将元素值更新为0,后者则将元素从Counter中移除。
清空Couter对象
>>>a.clear()
>>>a
Counter()
Counter提供了两个对象之间的运算操作
>>>aa = Counter("aaaaabbbccdef")
>>>bb = Counter("abbdccddefgh")
>>>aa
Counter({'a': 5, 'b': 3, 'c': 2, 'd': 1, 'e': 1, 'f': 1})
>>>bb
Counter({'a': 1, 'b': 2, 'd': 3, 'c': 2, 'e': 1, 'f': 1, 'g': 1, 'h': 1})
对两个Counter对象进行并(Union)
操作
运算结果中的元素key值为两个Counter对象的并集
,对应的value值为两个Couunter中相应value值`相加,未出现则按照0参与运算
>>>c = aa + bb
>>>c
Counter({'a': 6, 'b': 5, 'c': 4, 'd': 4, 'e': 2, 'f': 2, 'g': 1, 'h': 1})
对两个Counter对象进行差
操作
>>>d1 = aa - bb
>>>d1
Counter({'a': 4, 'b': 1})
运算结果Counter中的元素一定是在aa中出现过且未在bb中出现过的,同时对应元素的value相减,如果结果小于等于0,同样不会出现在结果中
注意:由于差
操作的运算性质,aa -bb
与 bb -aa
得到的结果不一样
>>>d2 = bb - aa
>>>d2
Counter({'d': 2, 'g': 1, 'h': 1})
运算结果中的元素key值为两个Counter对象的并集
,对应的value值为两个Couunter中相应key的value取最大(max)值
,未出现则按照0参与运算,+ 运算则是二者相应value
相加`,这是二者最显著的区别。
>>>ae = aa | bb
>>>ae
Counter({'a': 5, 'b': 3, 'c': 2, 'd': 3, 'e': 1, 'f': 1, 'g': 1, 'h': 1})
运算结果中的元素key值为两个Counter对象的交集
,对应的value值为两个Couunter中相应key的最小(min)值
,- 运算
则是二者相应value相减
,且相减结果小于等于0
则不出现在结果中,这是二者最显著的区别。
>>>bd = aa & bb
>>>bd
Counter({'a': 1, 'b': 2, 'c': 2, 'd': 1, 'e': 1, 'f': 1})