Python-Collections模块之Counter
Counter : dict的子类,用于计算可hash的对象
一、Counter : 可以支持方便、快速的计数
from collections import Counter cnt = Counter() wordList = ["a","b","c","c","a","a"] for word in wordList: cnt[word] +=1 print(cnt) #执行结果: Counter({'a': 3, 'c': 2, 'b': 1}) c = Counter() c = Counter('geadsafdsa')#从可迭代的字符串初始化counter print(c) #Counter({'a': 3, 'd': 2, 's': 2, 'g': 1, 'e': 1, 'f': 1}) c = Counter({'red':4,'blue':2})#从映射初始化counter print(c) c = Counter(cats = 8,dogs = 4)#从args初始化counter print(c) c = Counter(['eggs', 'ham']) print(c['apples']) #如某个项缺失,会返回0,不会报错 #执行结果 : 0 print(c) #执行结果: Counter({'eggs': 1, 'ham': 1}) c['eggs'] = 0 print(c) #执行结果: Counter({'ham': 1, 'eggs': 0})
二、Counter对象支持以下三个字典不支持的方法,elements(),most_common(),subtract(),update();
1、Counter.elements(): 返回一个迭代器,每个元素重复的次数为它的数目,顺序是任意的顺序,如果一个元素的数目少于1,那么elements()就会忽略它
c = Counter(a=2, b=4, c=0, d=-2, e=1) print(list(c.elements())) #执行结果:['a', 'a', 'b', 'b', 'b', 'b', 'e']
2、Counter.most_common() :返回一个列表,包含counter中n个最大数目的元素,如前三个。。。如果忽略n或者为None,most_common()将会返回counter中的所有元素,元素有着相同数目的将会以任意顺序排列
c = Counter('agagagarewqrwq').most_common(3) print(c) #执行结果: [('a', 4), ('g', 3), ('r', 2)] c = Counter('agagagarewqrwq').most_common() print(c) #执行结果: [('a', 4), ('g', 3), ('r', 2), ('w', 2), ('q', 2), ('e', 1)] c = Counter('agagagarewqrwq').most_common(None) print(c) #执行结果: [('a', 4), ('g', 3), ('r', 2), ('w', 2), ('q', 2), ('e', 1)]
3、Counter.subtract(): 从一个可迭代对象中或者另一个映射(或counter)中,元素相减,类似于dict.update(),但是substracts数目相减而不是替换它们,输入输出都有可能为0或者为负
c = Counter(a=4, b=2, c=0, d=-2) d = Counter(a=1, b=2, c=-3, d=4) c.subtract(d) print(c) #执行结果:Counter({'a': 3, 'c': 3, 'b': 0, 'd': -6})
4、Counter.update(): 两个可迭代对象元素相加,可迭代对象是一个元素序列,而非(key,value)对构成的序列
c = Counter(a=4, b=2,c=0, d=-2) d = Counter(a=1, b=2, c=-3, d=4) c.update(d)
print(c)
#执行结果: Counter({'a': 5, 'b': 4, 'd': 2, 'c': -3})
5、Counter对象常见操作
#1、统计所有的数目 c = Counter({'a': 5, 'b': 4, 'd': 2, 'c': -3}) print(sum(c.values())) #统计所有的数目 #2、列出所有的去重后的元素 c = Counter('bafdsagdsafdsa') print(c) #Counter({'a': 4, 'd': 3, 's': 3, 'f': 2, 'b': 1, 'g': 1}) a = list(c) print(a) #执行结果: ['b', 'a', 'f', 'd', 's', 'g'] #转换为set,dict,list c = Counter('bafdsagdsafdsa') dict = dict(c) print(dict) #{'b': 1, 'a': 4, 'f': 2, 'd': 3, 's': 3, 'g': 1} s = set(c) print(s) #{'g', 'a', 'f', 'd', 's', 'b'} list = list(c.items()) print(list) #执行结果:[('b', 1), ('a', 4), ('f', 2), ('d', 3), ('s', 3), ('g', 1)] #删除数目为0和为负的元素 c = Counter({'a': 5, 'b': 4, 'd': 2, 'c': -3}) c += Counter() print(c) #执行结果: Counter({'a': 5, 'b': 4, 'd': 2}) #清空counter b = Counter({'a': 5, 'b': 4, 'd': 2, 'c': -3}) b.clear() print(b) #在Counter对象中进行数学操作 c = Counter(a=3, b=1, c=-2) d = Counter(a=1, b=2, c=4) print(c + d) # 求和, Counter({'a': 4, 'b': 3, 'c': 2}) print(c - d) #求差,Counter({'a': 2}) 可以减,但不输出为0或者为负的元素个数 print(c & d) #求交集 Counter({'a': 1, 'b': 1}) print(c | d) #求并集 Counter({'c': 4, 'a': 3, 'b': 2})
三十六般武艺,七十二般变化,修练出个人品牌并发出光芒