我有一個包含許多地圖的串列(它們都有相同的鍵),如下所示:
({:a 1} {:a 1} {:a 2} {:a 2} {:a 3} {:a 2})
我想將其轉換為存盤每個地圖的值出現的地圖。例如,上面的串列應該回傳以下地圖:
{:1 2, :2 3, :3 1}
關于如何做到這一點的任何想法?
uj5u.com熱心網友回復:
(def m '({:a 1} {:a 1} {:a 2} {:a 2} {:a 3} {:a 2}))
(frequencies (map :a m)) ;; => {1 2, 2 3, 3 1}
請注意,結果的鍵不是關鍵字,因為這樣做很奇怪。
uj5u.com熱心網友回復:
我會這樣解決:
(ns tst.demo.core
(:use demo.core tupelo.core tupelo.test))
(defn maps->freqs
[maps]
(frequencies
(for [m maps]
(second (first m)))))
(dotest
(let [data (quote
({:a 1} {:a 1} {:a 2} {:a 2} {:a 3} {:a 2}))]
(is= (maps->freqs data)
{1 2, 2 3, 3 1})))
以上使用了我最喜歡的模板專案。最好的技術是慢慢地建立它:
(defn maps->freqs
[maps]
(for [m maps]
(first m)))
然后(spyx-pretty (maps->freqs data))產生
(maps->freqs data) =>
[[:a 1] [:a 1] [:a 2] [:a 2] [:a 3] [:a 2]]
修改它:
(defn maps->freqs
[maps]
(for [m maps]
(second (first m))))
結果
(maps->freqs data) =>
[1 1 2 2 3 2]
然后使用frequencies得到最終結果。
請務必閱讀檔案串列,尤其是 Clojure CheatSheet!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/373976.html
