clojure中分组数据的计数
我将clojure中的数据按应用程序分组为以下格式:clojure中分组数据的计数,clojure,Clojure,我将clojure中的数据按应用程序分组为以下格式: (["name1" [{:application "name1", :date "date1", :description "desc1"} {:application "name1", :date "date2", :description "desc2"}]] ["name2" [{:application "name2", :date "date1", :description "desc1"}
(["name1" [{:application "name1", :date "date1", :description "desc1"}
{:application "name1", :date "date2", :description "desc2"}]]
["name2" [{:application "name2", :date "date1", :description "desc1"}
{:application "name2", :date "date2", :description "desc2"}]]
... and so on)
我需要计算每个应用程序的事件数(即每个向量中的贴图数),并生成以下格式的贴图列表:
({:application "name1", :count 2} {:application "name2", :count2} ... etc )
我有下面的代码来生成一个应用程序名列表和每个应用程序名的计数列表,但是我正在努力使它们回到上面的格式
(let[
application-list (map first group-by-app)
grouped-data (map second group-by-app)
count-list (map count grouped-data)]
任何帮助都将不胜感激
提前谢谢。
大卫
“分组”是您提供的分组数据。
for
提供了一种非常简洁但富有表现力的方法,用于处理序列元素以构建新序列。我当然会在这里推荐它
(def group-by-app '(["name1" [{:application "name1", :date "date1", :description "desc1"}
{:application "name1", :date "date2", :description "desc2"}]]
["name2" [{:application "name2", :date "date1", :description "desc1"}
{:application "name2", :date "date2", :description "desc2"}]]))
(for [[application events] group-by-app]
{:application application, :count (count events)})
; => ({:application "name1", :count 2} {:application "name2", :count 2})
然而,为了完整起见,值得注意的是,map
可以同时映射多个序列上的函数。因此,您可以将生成的中间数据与应用程序和计数的函数重新组合
(let [application-list (map first group-by-app)
grouped-data (map second group-by-app)
count-list (map count grouped-data)]
(map
(fn [app event-count]
{:application app :count event-count})
application-list count-list))
groupby
生成一个映射,它是一个键值对序列。您可以简单地映射该序列
user=> (def foo #{{:application "name1", :date "date1", :description "desc1"}
#_=> {:application "name1", :date "date2", :description "desc2"}
#_=> {:application "name2", :date "date1", :description "desc1"}
#_=> {:application "name2", :date "date2", :description "desc2"}})
#'user/foo
user=> (map #(let [[key tuples] %] [key (count tuples)]) (group-by :application foo))
(["name1" 2] ["name2" 2])
如果你需要的话,你可以把它变成地图
user=> (into {} (map #(let [[key tuples] %] [key (count tuples)]) (group-by :application foo)))
{"name1" 2, "name2" 2}
正是我需要的。谢谢
user=> (into {} (map #(let [[key tuples] %] [key (count tuples)]) (group-by :application foo)))
{"name1" 2, "name2" 2}