需要用Python写一段代码,给定一堆关键词,返回出现次数最多的n个关键字。

第一反应是采用一个dict,key存储关键词,value存储出现次数,如此一次遍历即可得出所有不同关键词的出现次数,而后排序取出前n个关键词即可。

然而仔细一思考,这种类似需求应该很常见,Python应该有提供更好的方式实现才对,于是找了下资料,发现可以使用collections模块中的Counter类实现。

Counter类继承于dict类,所以具有类似字典的行为,key存储元素,value则固定存储出现次数。

利用Python Counter快速计算出现次数topN的元素-LMLPHP

使用方法很简单,支持传入一个iterable对象初始化,以下依次是传入str,list和dict的初始化方式:

>>> from collections import Counter
>>> ac = Counter('abcdefgabc') # str对象初始化
>>> ac
Counter({'a': 2, 'c': 2, 'b': 2, 'e': 1, 'd': 1, 'g': 1, 'f': 1})
>>> ac = Counter(['abcd', 'bcde']) # list对象初始化
>>> ac
Counter({'abcd': 1, 'bcde': 1})
>>> ac = Counter({'abc': 3, 'cde': 5}) # dict对象初始化
>>> ac
Counter({'cde': 5, 'abc': 3})

同时Counter支持类似dict行为的update,可以用来合并两个不同的Counter或者符合Counter要求的dict对象,如:

>>> ac = Counter({'abc': 3, 'cde': 5})
>>> ac
Counter({'cde': 5, 'abc': 3})
>>> bc = Counter('ablmhopq')
>>> bc
Counter({'a': 1, 'b': 1, 'h': 1, 'm': 1, 'l': 1, 'o': 1, 'q': 1, 'p': 1})
>>> ac.update(bc) # 传入Counter对象update
>>> ac
Counter({'cde': 5, 'abc': 3, 'a': 1, 'h': 1, 'm': 1, 'l': 1, 'o': 1, 'q': 1, 'p': 1, 'b': 1})
>>> ac.update({'cde': 8, 'q': 2}) # 传入dict对象update
>>> ac
Counter({'cde': 13, 'abc': 3, 'q': 3, 'a': 1, 'h': 1, 'm': 1, 'l': 1, 'o': 1, 'p': 1, 'b': 1})

而如果要返回出现次数topN的元素,Counter也已经提供了现成的方法most_common:

>>> ac.most_common(5) # 按序输出出现次数top5的元素,如不指定数字,则按序输出全部元素
[('cde', 13), ('abc', 3), ('q', 3), ('a', 1), ('h', 1)]

至此,使用者不需要关注key-value去重、计数的细节,以及最后的排序逻辑,寥寥数行代码即可完成需求。

05-27 10:07