小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
Counter作为字典dict()的一个子类用来进行hashtable计数,将元素数量进行统计,计数后返回一个字典,键为元素,值为元素个数
from collections import Counter
str1 = "abcbcaccbbad"
li = ["a", "b", "c", "a", "b", "b"]
dict1 = {"1": 3, "3": 2, "17": 2}
#Counter获取各元素的个数,返回字典
print ("Counter(s):", Counter(str1))
print ("Counter(li):", Counter(li))
print ("Counter(d):", Counter(d))
复制代码
result:
Counter(s): Counter({'b': 4, 'c': 4, 'a': 3, 'd': 1})
Counter(li): Counter({'b': 3, 'a': 2, 'c': 1})
Counter(d): Counter({'1': 3, '3': 2, '17': 2})
复制代码
下面对其中几个重要的方法加以介绍
1 most_common方法
按照元素出现的次数进行从高到低的排序,返回元素的字典
1.1 默认情形
默认情形下返回所有元素的字典
print(Counter(str1).most_common())
复制代码
result:
[('b', 4), ('c', 4), ('a', 3), ('d', 1)]
复制代码
1.2 指定数量
指定数字为n时,返回排序前n位的元素字典
print(Counter(str1).most_common(2))
复制代码
result:
[('b', 4), ('c', 4)]
复制代码
2 elements方法
返回经过计算器Counter后的元素迭代器
2.1 字典情形
此时返回value个key的元素迭代器
dict1 = {"1": 3, "3": 2, "17": 2}
dict_counter = Counter(dict1)
print("sorted(str_iter):", sorted(dict_counter.elements()))
复制代码
result:
sorted(str_iter): ['1', '1', '1', '17', '17', '3', '3']
复制代码
print(list(dict_counter.elements()))
复制代码
result:
['1', '1', '1', '3', '3', '17', '17']
复制代码
可以看到,‘1'的值为3,所以返回了3个'1'。其余情形依次类推
2.2 其他
此时返回所有元素的迭代器
str1 = "abcbcaccbbad"
str1 = Counter(str1)
print ("sorted(str1.elements()):", sorted(str1.elements()))
复制代码
result:
sorted(str1.elements()): ['a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'd']
复制代码
print(list(str1.elements()))
复制代码
result:
['a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'd']
复制代码
3 update方法
对Counter里面的元素进行更新
dict1 = {"1": 3, "3": 2, "17": 2}
dict_counter = Counter(dict1)
print(dict_counter)
复制代码
result:
Counter({'1': 3, '3': 2, '17': 2})
复制代码
3.1 字典情形
dict_counter.update({'key':123})
print(dict_counter)
复制代码
result:
Counter({'key': 123, '1': 3, '3': 2, '17': 2})
复制代码
dict_counter.update({'key':456})
print(dict_counter)
复制代码
result:
Counter({'key': 579, '1': 3, '3': 2, '17': 2})
复制代码
可以看到,同一个key对应的value会叠加每次update对应的value作为最终的value
3.2 列表情形
dict_counter.update([123])
print(dict_counter)
复制代码
result:
Counter({'1': 3, '3': 2, '17': 2, 123: 1})
复制代码
dict_counter.update([123])
print(dict_counter)
复制代码
result:
Counter({'1': 3, '3': 2, '17': 2, 123: 2})
复制代码
3.3 字符串情形
dict_counter.update('update')
print(dict_counter)
复制代码
result:
Counter({'1': 3, '3': 2, '17': 2, 'u': 1, 'p': 1, 'd': 1, 'a': 1, 't': 1, 'e': 1})
复制代码
dict_counter.update('update')
print(dict_counter)
复制代码
result:
Counter({'1': 3, '3': 2, '17': 2, 'u': 2, 'p': 2, 'd': 2, 'a': 2, 't': 2, 'e': 2})
复制代码
\
4 substract方法
和update方法作用相反,update是做加法操作,而substract是做减法操作
dict1 = {"1": 3, "3": 2, "17": 2}
dict_counter = Counter(dict1)
print(dict_counter)
复制代码
result:
Counter({'1': 3, '3': 2, '17': 2})
复制代码
4.1 字典情形
dict_counter.subtract({'key':456})
print(dict_counter)
复制代码
result:
Counter({'1': 3, '3': 2, '17': 2, 'key': -456})
复制代码
dict_counter.subtract({'key':456})
print(dict_counter)
复制代码
result:
Counter({'1': 3, '3': 2, '17': 2, 'key': -912})
复制代码
4.2 列表情形
dict_counter.subtract([123])
print(dict_counter)
复制代码
result:
Counter({'1': 3, '3': 2, '17': 2, 123: -1})
复制代码
dict_counter.subtract([123])
print(dict_counter)
复制代码
result:
Counter({'1': 3, '3': 2, '17': 2, 123: -2})
复制代码
4.3 字符串情形
dict_counter.subtract('update')
print(dict_counter)
复制代码
result:
Counter({'1': 3, '3': 2, '17': 2, 'u': -1, 'p': -1, 'd': -1, 'a': -1, 't': -1, 'e': -1})
复制代码
dict_counter.subtract('update')
print(dict_counter)
复制代码
result:
Counter({'1': 3, '3': 2, '17': 2, 'u': -2, 'p': -2, 'd': -2, 'a': -2, 't': -2, 'e': -2})
复制代码
5 items方法
同字典的items方法一致
dict1 = {"1": 3, "3": 2, "17": 2}
dict_counter = Counter(dict1)
print(dict1.items())
print(dict_counter.items())
复制代码
result:
dict_items([('1', 3), ('3', 2), ('17', 2)])
dict_items([('1', 3), ('3', 2), ('17', 2)])
复制代码
6.keys方法
同字典的keys方法一致
dict1 = {"1": 3, "3": 2, "17": 2}
dict_counter = Counter(dict1)
print(dict1.keys())
print(dict_counter.keys())
复制代码
result:
dict_keys(['1', '3', '17'])
dict_keys(['1', '3', '17'])
复制代码
7.values方法
同字典的values方法一致
dict1 = {"1": 3, "3": 2, "17": 2}
dict_counter = Counter(dict1)
print(dict1.values())
print(dict_counter.values())
复制代码
result:
dict_values([3, 2, 2])
dict_values([3, 2, 2])
复制代码