topK问题 前K个高频元素 leetcode692

给一非空的单词列表,返回前?k?个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。

示例:

输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2
输出: ["i", "love"]
解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。
    注意,按字母顺序 "i" 在 "love" 之前。

假定 k 总为有效值, 1 ≤ k ≤ 集合元素数。
输入的单词均由小写字母组成。

代码如下:

class Solution:
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """ 
        count = collections.Counter(nums)   
        # return heapq.nlargest(k, count.keys(), key=count.get) 
        return count.most_common(k)

Counter 继承自 dict,默认是降序。
most_common 是基于 heapq 实现的。


合并多个 Counter 对象

count2 = Counter(nums)
count.update(count2)
print(count)

实例:词频统计,取出前5

with open(‘example.txt‘) as f:
    txt = f.read()
    w = re.split(‘\W+‘, txt)
    print(w)
    c2 = Counter(w)
    res = c2.most_common(5)
    print(res)
    # [(‘a‘, 21), (‘the‘, 16), (‘to‘, 15), (‘and‘, 12), (‘Service‘, 8)]

参考:
https://leetcode-cn.com/problems/top-k-frequent-words/
https://docs.python.org/3/library/collections.html#counter-objects
https://docs.python.org/3/library/heapq.html