通过地图的值转换地图列表 [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}
请注意结果的键不是关键字,因为这样做会很奇怪。
我有一个包含许多地图的列表(所有地图都有相同的键),如下所示:
({: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}
请注意结果的键不是关键字,因为这样做会很奇怪。