Clojure 地图的最高 3 个值

Por*_*gas 3 clojure

嗨,我正在尝试执行一个返回 3 个最常见字符串的函数

  (take 3 (sort-by val > (frequencies s))))

(freq ["hi" "hi" "hi" "ola" "hello" "hello" "string" "str" "ola" "hello" "hello" "str"])
Run Code Online (Sandbox Code Playgroud)

到目前为止我已经得到了这个,但注意到如果有超过 1 个具有相同频率的字符串,它将不会返回。有没有办法按频率函数的最高值(最终是前 3 个最高值)来过滤频率函数的值?

提前致谢。

lee*_*ski 7

我会提出稍微不同的解决方案,其中涉及用group-by值(即项目的计数)反转频率图:

(->> data
     frequencies
     (group-by val))

;;{3 [["hi" 3]],
;; 2 [["ola" 2] ["str" 2]],
;; 4 [["hello" 4]],
;; 1 [["string" 1]]}
Run Code Online (Sandbox Code Playgroud)

所以你唯一需要的就是对它进行排序和处理:

(->> data
     frequencies
     (group-by val)
     (sort-by key >)
     (take 3)
     (mapv (fn [[k vs]] {:count k :items (mapv first vs)})))

;;[{:count 4, :items ["hello"]}
;; {:count 3, :items ["hi"]}
;; {:count 2, :items ["ola" "str"]}]
Run Code Online (Sandbox Code Playgroud)