Python内置模块collections中的Counter是字典子类。Counter不是字典,但很像字典。
Counter具有字典的键和值,键是各个元素,值为该元素出现的次数。
Counter相当于计数器。常用于哈希映射(哈希表)。
from collections import Counter
# 获取所有Counter对象的方法
[x for x in dir(Counter) if not x.startswith('_')]
# 结果:
['clear', 'copy', 'elements', 'fromkeys', 'get',
'items', 'keys', 'most_common', 'pop', 'popitem',
'setdefault', 'subtract', 'total', 'update', 'values']
初始化Counter:
from collections import Counter
# 初始化Counter
c = Counter() # 结果:Counter()
c = Counter('good') # 结果:Counter({'o': 2, 'g': 1, 'd': 1})
c = Counter(['g','o','o','d']) # 结果:Counter({'o': 2, 'g': 1, 'd': 1})
c = Counter({'red': 4, 'blue': 2}) # 结果:Counter({'red': 4, 'blue': 2})
c = Counter(cats=4, dogs=8) # 结果:Counter({'dogs': 8, 'cats': 4})
type(c) # 结果:<class 'collections.Counter'>
将值设置为0、删除元素、清除所有元素:
键值对中的值允许为0以及负数。将设置为0不能将元素删除。
del Counter(...)[键]:删除元素。
Counter(...).pop():删除元素,并返回删除元素的值。
Counter(...).popitem():随机删除元素,返回元组。
Counter(...).clear():清除所有元素。
from collections import Counter
c = Counter('goods') # 结果:Counter({'o': 2, 'g': 1, 'd': 1, 's': 1})
# 将'g'元素的值设为0
c['g']=0
c # 结果:Counter({'o': 2, 'd': 1, 's': 1, 'g': 0})
# 删除'g'元素
del c['g']
c # 结果:Counter({'o': 2, 'd': 1, 's': 1})
# 删除'd'元素,并返回删除元素的值
c.pop('d') # 结果:1
c # 结果:Counter({'o': 2, 's': 1})
# 随机删除元素
c.popitem() # 结果:('s', 1)
c # 结果:Counter({'o': 2})
# 清除所有元素
c.clear()
c # 结果:Counter()
共有多少元素、获取所有元素、遍历各个元素:
Counter(...).total():统计元素总和。即共有多少个元素,或者所有元素的值的总和
Counter(...).elements():显示所有元素。元素的个数等于所有元素值的和。返回迭代器。
Counter(...).keys():显示所有键(即不重复元素)。
Counter(...).values():显示所有值(即各个键对应的值)。
Counter(...).items():显示所有键值对,元组形式即(键,值)。
from collections import Counter
c = Counter('good') # 结果:Counter({'o': 2, 'd': 1, 'g': 0})
# 所有元素计数的总和(即共有多少个元素,或者所有元素的值的总和)
c.total() # 结果:4
# 获取所有元素
set(c) # 结果:{'g', 'o', 'd'}
dict(c) # 结果:{'g': 1, 'o': 2, 'd': 1}
list(c) # 结果(元素不重复):['g', 'o', 'd']
list(c.elements()) # 结果(元素重复):['g', 'o', 'o', 'd']
list(c.keys()) # 结果(键):['g', 'o', 'd']
list(c.values()) # 结果(值):[1, 2, 1]
list(c.items()) # 结果(键值对):[('g', 1), ('o', 2), ('d', 1)]
# 遍历元素
for x in c.elements():
print(f"{x}:出现次数{c[x]}次")
# 结果:
g:出现次数1次
o:出现次数2次
o:出现次数2次
d:出现次数1次
# 遍历键
for x in c.keys():
print(f"{x}:出现次数{c[x]}次")
# 结果:
g:出现次数1次
o:出现次数2次
d:出现次数1次
# 遍历值
for x in c.values():
print(x)
# 结果:
1
2
1
# 遍历键值对
for key,val in c.items():
print(f"{key}:{val}")
# 结果:
g:1
o:2
d:1
增加元素值、减少元素值:
Counter(...).update(...):和另一个Counter或可迭代对象的所有元素对应的值相加。增加元素的值而不是替换值。
Counter(...).subtract(...):和另一个Counter或可迭代对象的所有元素对应的值相减。减少元素的值而不是替换值。没有元素,也可以减少,值为负数。
from collections import Counter
c = Counter('good') # 结果:Counter({'o': 2, 'g': 1, 'd': 1})
# 添加元素(增加值 而不是 替换值)
c.update({'g':4})
c # 结果:Counter({'g': 5, 'o': 2, 'd': 1})
c.update(a=3)
c # 结果:Counter({'g': 5, 'a': 3, 'o': 2, 'd': 1})
# 减少元素(减少值 而不是 替换值)
c.subtract(g=2)
c # 结果:Counter({'g': 3, 'a': 3, 'o': 2, 'd': 1})
c.subtract({'a'=3})
c # 结果:Counter({'g': 3, 'o': 2, 'd': 1, 'a': 0})
c.subtract(h=3)
c # 结果:Counter({'g': 3, 'o': 2, 'd': 1, 'a': 0, 'h': -3})
查看最常出现的元素:
Counter(...).most_common(...):获取一组数据中最常出现的数据。返回列表,列表中内容为元组(元素,出现次数)。
from collections import Counter
c = Counter('good') # 结果:Counter({'o': 2, 'g': 1, 'd': 1})
# 最常出现的2个数据
c.most_common(2) # 结果:[('o', 2), ('g', 1)]
# 最常出现的1个数据
c.most_common(1) # 结果:[('o', 2)]
获取元素的值:
Counter(...).get(键):通过键获取值,没有返回None。
Counter(...).setdefault(键,值):通过键获取值,没有可将添加键值对,没有值默认None。
from collections import Counter
c = Counter('good') # 结果:Counter({'o': 2, 'g': 1, 'd': 1})
c.get('o') # 结果:2
c.get('a') # 结果:None
c # 结果:Counter({'o': 2, 'g': 1, 'd': 1})
c.setdefault('g') # 结果:1
c.setdefault('a') # 结果:None
c # 结果:Counter({'g': 1, 'o': 2, 'd': 1, 'a': None})
c.setdefault('k',9) # 结果:9
c # 结果:Counter({'g': 1, 'o': 2, 'd': 1, 'a': None, 'k': 9})
拷贝Coutner:
Counter(...).copy():复制Counter,修改不影响原Counter。
from collections import Counter
c = Counter(a=3,d=1)
c # 结果:Counter({'a': 3, 'd': 1})
f = c.copy()
f # 结果:Counter({'a': 3, 'd': 1}
# 修改复制后的Counter,原Counter不改变
f['a']=2
f # 结果:Counter({'a': 2, 'd': 1})
c # 结果:Counter({'a': 3, 'd': 1})
补充: