通过名称就能明白Counter就是一个计数器,准确的说是对可哈希的对象进行数。
学习重点:
1. 加减操作,结果过滤掉了所有小于等于0的键值对
2. 没有fromkeys()方法
3. update()类似加法操作但有所差异, 和"+"区别,保留所有结果,且直接修改原对象
4. c['s'] 如果没有对应的键不会报错,返回0值
Counter对象简要说明:
- Counter是dict的子类
- 对可哈希对象进行计数(被计数对象作为键,计数结果为值) ---- 可哈希: 实现了__hash__(self, *args, **kwargs)方法对象
- 无序
- 值的类型: int, float,bool(计算时True变为1,False变为0)
- 特色: 改对象可以直接进行加减操作:
>>> c = Counter(a=10, b=6, c=0) >>> d = Counter(a=5, b=7, c=0) >>> c - d # 返回新的Counter对象 Counter({'a': 5}) # 过滤掉了对应差值小于等于0的键对 >>> c + d Counter({'a': 15, 'b': 13}) # 过滤掉了对应差值小于等于0的键对
- 实现了除了fromkeys()之外所有方法,不同的方法update() --- 类似加法操作, 字典中是后面的值覆盖原先的值
>>> c = Counter(a=10, b=6, c=0) >>> d = Counter(a=5, b=7, c=0) >>> c.update(d) # 直接对修改c本身, 且保留所有的键值对 >>> c Counter({'a': 15, 'b': 13, 'c': 0}) # c和d中对应键的值相加 >>> c_dic = {'a': 10, 'b': 6, 'c': 0} >>> d_dic = {'a': 5, 'b': 7, 'c': 0} >>> c_dic.update(d_dic) # d_dic中对应键的值覆盖了c_dic中 的值 >>> c_dic {'a': 5, 'b': 7, 'c': 0}
基本操作:
- 创建:
>>> c = Counter() # 建空Counter >>> c = Counter('gallahad') # 从可迭代对象创建,如list,tuple,str,... >>> c = Counter({'red': 4, 'blue': 2}) # 从字典创建 >>> c = Counter(cats=4, dogs=8) # 通过键值对创建
- 增加:
- c[ 'a' ] = 10 # 通过类似字典操作
- c.setdefault('a', 10) # 注: 此操作在c中没有‘a’时在c中添加c且值为10,如果c中已包含‘a’则不做任何操作(原来c的值不变)
- c.update() , 源码 : def update(*args, **kwds):所以update中可以加入list,str,dict,Counter
- 注意: 该方法和dict的不同,dict中后面的值后替换原有的值,而该方法是值相加
- 例: c = Counter(a=10); c.uptate(a=20), 结果a的值为30
- 如: c.update("asdfasdasdasdas"), c.update(['aaa', 'bbb']), c.update(aaa=111, bbb=2)
-
>>> c = Counter() >>> c.update('abcde') >>> print(c) # 结果 Counter({'a': 1, 'b': 1, 'c': 1, 'd': 1, 'e': 1})
- 注意: 该方法和dict的不同,dict中后面的值后替换原有的值,而该方法是值相加
- 删:
- c.clear() # 清空
- del c['a'] # 删除‘a’键值对
- 改:
- c['a'] = 10000
- 查:
- 查所有键(key):c.keys()
- 查看所有值: c.values()
- 查看某个键对应的值:1. c['a'] # 注: 与字典不同的是如果c中没有对应的键时返回 0 , 2. c.get('a') # 同dict操作
- 查结果中个数(值)最大 的几个: c.
most_common
([n]), 如果没传入数值或者传入None,返回所有键值对元组的有序列表>>> c = Counter(a=2,b=3,c=1) >>> c.most_common() [('b', 3), ('a', 2), ('c', 1)]
-
获取所有元素列表:
>>> c = Counter(a=2,b=3,c=1) >>> list(c.elements()) ['a', 'a', 'b', 'b', 'b', 'c']
-
另外还有字典的操作: c.items(), 等除了.fromkeys() Counter中没实现
-
计算类操作:
-
减法:
>>> c = Counter(a=10, b=6, c=0) >>> d = Counter(a=5, b=7, c=0) >>> c - d # 返回新的Counter对象 Counter({'a': 5}) # 过滤掉了对应差值小于等于0的键对 >>> c.subtract(d) # 直接对修改c本身, 且保留所有的键值对 >>> c Counter({'a': 5, 'c': 0, 'b': -1})
-
加法:
>>> c = Counter(a=10, b=6, c=0) >>> d = Counter(a=5, b=7, c=0) >>> c + d # 返回新的Counter对象 Counter({'a': 15, 'b': 13}) # 过滤掉了对应值小于等于0的键对 >>> c.update(d) # 直接对修改c本身, 且保留所有的键值对 >>> c Counter({'a': 15, 'b': 13, 'c': 0})
-
到这里Counter中的方法及注意事项就讲完了,如果有疑问可以通过评论区交流,请大家批评指正。