1

我有 clojure 中的数据,我按应用程序将其分组为以下格式:

(["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)]

任何帮助将不胜感激。

提前致谢。大卫

4

3 回答 3

1

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))
于 2013-08-13T19:11:32.767 回答
1

group-by生成一个映射,它是一系列键值对。您可以简单地映射该序列。

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}
于 2013-08-13T19:34:07.267 回答
0
(reduce
  (fn [acc [_ maps]]
    (let [c (count maps)]
      (into acc 
        (map #(assoc % :count c) maps))))
  '()
  grouped)

grouped 是您提供的分组数据。

于 2013-08-13T18:32:51.877 回答