背景:其实最开始是在解一个比较大规模的问题,这只是其中一个子问题,解决这道题的方法多种多样,比如先set去重一下list,然后使用list的count函数分别统计每个元素的出现次数,最后输出想要的list信息。这里说一下Python里面有一个很快捷的解法,不需要set,哈希,排序等额外操作
老规矩,还是直接上代码:
from collections import Counter
if __name__ == '__main__':
words = [1, 1, 1, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5]
collection_words = Counter(words)
print(collection_words)
print(collection_words.keys())
print(collection_words.values())
print(max(collection_words.values()))
print(type(collection_words))
程序运行结果:
Counter({4: 4, 1: 3, 3: 3, 5: 2, 2: 1})
dict_keys([1, 2, 3, 4, 5])
dict_values([3, 1, 3, 4, 2])
4
<class 'collections.Counter'>
1、导入collections模块的Counter类
Python模块千千万,这个模块非常赞,尤其是Counter这个类,可以直接统计list里面所有不同元素分别的出现次数,然后按照结果从大到小排序
2、结果类型
可以看到结果虽然是<class 'collections.Counter'>格式,但其本质上是一个字典类型,所以可以使用一切字典操作来操作这个结果变量
但是当我们单独输出这个字典的key和value的时候,字典就不会按照每个元素的出现顺序排列了,而是元素在列表中出现的实际先后顺序
所以这里有两种方式可以取到出现次数的最大值
1)max函数
print(max(collection_words.values()))
这样只能取到出现次数的最大值,但是不知道是哪个/哪几个元素出现了这么多次
2)字典排序(lambda函数)
collection_word = Counter(words)
collection_words = sorted(collection_word.items(), key=lambda x: x[1], reverse=True)
print(collection_words)
程序运行结果:
[(4, 4), (1, 3), (3, 3), (5, 2), (2, 1)]
使用lambda函数对字典排序,按照key为排序关键词,最后reverse倒序,结果可以直接调用
max_item = collection_words[0][0]
max_count = collection_words[0][1]
总结:Python里的模块&类还是很多的,如果不是面试手撕代码,直接调用这些类一定比自己重复造轮子要好得多,而且也不一定有人家定义好的这么高效