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

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 に答える
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 に答える
0
(reduce
  (fn [acc [_ maps]]
    (let [c (count maps)]
      (into acc 
        (map #(assoc % :count c) maps))))
  '()
  grouped)

grouped は、指定したグループ化されたデータです。

于 2013-08-13T18:32:51.877 に答える