clojure-计算向量内hashmap中的出现次数
给定以下向量:clojure-计算向量内hashmap中的出现次数,clojure,Clojure,给定以下向量: [{:id "1" :performed [{:type "typeA"}, {:type "typeA"}, {:type "typeB"}]}, {:id "2" :performed [{:type "typeB"}, {:type "typeB"}, {:type "typeB"}]} 如何计算已执行类型的出现次数 预期产出: [{:id "1" :typeA 2 :typeB 1}, {:id "2" :typeB "3"}] 您的输入不是有效的数据结构,我在假
[{:id "1" :performed [{:type "typeA"}, {:type "typeA"}, {:type "typeB"}]},
{:id "2" :performed [{:type "typeB"}, {:type "typeB"}, {:type "typeB"}]}
如何计算已执行类型的出现次数
预期产出:
[{:id "1" :typeA 2 :typeB 1}, {:id "2" :typeB "3"}]
您的输入不是有效的数据结构,我在假设您需要地图向量的情况下对其进行了清理,并确保
type
始终是一个关键字:
(def foo
[{:id "1" :performed [{:type "typeA"} {:type "typeA"} {:type "typeB"}]}
{:id "2" :performed [{:type "typeB"} {:type "typeB"}{:type "typeB"}]}])
(defn do-eet [vector-of-maps]
(for [[id performed]
(map (juxt :id :performed) vector-of-maps)]
(merge {:id id }
(frequencies (mapcat vals performed)))))
(do-eet foo)
在您的示例中,括号不太匹配,但假设您的意思是这样的
(def data
[{:id "1" :performed [{:type "typeA"}, {:type "typeA"}, {:type "typeB"}]}
{:id "2" :performed [{:type "typeB"}, {:type "typeB"}, {:type "typeB"}]}])
你可以写
(mapv
(fn [{:keys [id performed]}]
(->> performed
(map (comp keyword :type))
frequencies
(into {:id id})))
data)
要得到这个答案:
[{:id "1", :typeA 2, :typeB 1} {:id "2", :typeB 3}]
但是,您可以考虑另一个代理是否能更好地为您服务。比如说
(->> data
(map (juxt :id #(->> % :performed (map :type) frequencies)))
(into {}))
会给出结果吗
{"1" {"typeA" 2, "typeB" 1}, "2" {"typeB" 3}}
我更喜欢你的:)谢谢!这一切都是关于语言的表现力:)