python3 collections.Counter

python3 collections.Counter

collections

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

从语义上来看,collections.Counter()可以看成是一个计数器,它可以的对象包括元组(tuple)、字符串(str)、数组(array)、列表(list)等,并提供了很多方便快捷的操作运算。

1. 创建Counter对象

用字符串初始化Counter

	from collections import Counter
	a = Counter('aaasdfhasdfbnvf')
	print(a)
	print(type(a))

运行结果
在f这里插入图片描述
用List进行Counter的初始化

	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本身作为统计、计数的操作)

2. 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
3. Counter对象的删除

前面我们可以看到当某一个元素不存在于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()
4. 两个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 -bbbb -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})

你可能感兴趣的:(python基础,python)