需要用Python寫一段代碼,給定一堆關鍵詞,返回出現次數最多的n個關鍵字。
第一反應是采用一個dict,key存儲關鍵詞,value存儲出現次數,如此一次遍歷即可得出所有不同關鍵詞的出現次數,而后排序取出前n個關鍵詞即可。
然而仔細一思考,這種類似需求應該很常見,Python應該有提供更好的方式實現才對,於是找了下資料,發現可以使用collections模塊中的Counter類實現。
Counter類繼承於dict類,所以具有類似字典的行為,key存儲元素,value則固定存儲出現次數。
使用方法很簡單,支持傳入一個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去重、計數的細節,以及最后的排序邏輯,寥寥數行代碼即可完成需求。