Clojure如何获取频次排名前三的字符串,处理同频次并列场景
解决方案
你可以先提取去重后的前三档最高频次,再按这组频次阈值筛选所有符合条件的条目,就能保留所有并列排名的结果,实现代码如下:
(defn top-n-freqs [n coll] (let [freq-map (frequencies coll) ;; 提取去重后的前n个最高频次 top-n-values (take n (sort > (distinct (vals freq-map))))] ;; 筛选所有频次属于前n档的条目 (filter (fn [[k v]] (contains? (set top-n-values) v)) freq-map))) ;; 调用示例,取前3档频次的所有条目 (top-n-freqs 3 ["hi" "hi" "hi" "ola" "hello" "hello" "string" "str" "ola" "hello" "hello" "str"])
示例调用返回结果如下(顺序可自行调整):(["hello" 4] ["hi" 3] ["ola" 2] ["str" 2])
如果需要返回结果按频次降序固定排序,可以用调整后的版本:
(defn top-n-freqs-sorted [n coll] (let [freq-map (frequencies coll) top-n-values (take n (sort > (distinct (vals freq-map))))] (sort-by val > (filter (fn [[k v]] (contains? (set top-n-values) v)) freq-map))))
内容的提问来源于stack exchange,提问作者Portgas
相关产品推荐
相关产品推荐

