通过地图的值转换地图列表 [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})

我想将它转换为存储每个映射值出现的映射。例如,上面的列表应该 return 下面的映射:

{: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得到最后的结果

请务必阅读 list of documentation,尤其是 Clojure CheatSheet!

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

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

请注意结果的键不是关键字,因为这样做会很奇怪。