簡體   English   中英

通過地圖的值轉換地圖列表 [clojure]

[英]Convert a list of maps by the values of the maps [clojure]

我有一個包含許多地圖的列表(所有地圖都有相同的鍵),如下所示:

({:a 1} {:a 1} {:a 2} {:a 2} {:a 3} {:a 2})

我想將其轉換為存儲每個 map 值出現的 map。 例如,上面的列表應返回以下 map:

{:1 2, :2 3, :3 1}

關於我該怎么做的任何想法?

(def m '({:a 1} {:a 1} {:a 2} {:a 2} {:a 3} {:a 2}))

(frequencies (map :a m)) ;; => {1 2, 2 3, 3 1}

請注意,結果的鍵不是關鍵字,因為這樣做很奇怪。

我會這樣解決它:

(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!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM