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