簡體   English   中英

Clojure-使用過濾器

[英]Clojure - Using Filters

我正在嘗試遍歷地圖以計算單個事件的特定發生次數,盡管在使用以下過濾器時遇到了一些麻煩。 我想要做的是過濾並計算每個“ ORDER_CATEGORY”的特定實例,這些實例以多個級別(1、2等)出現。 我可以遍歷月份並進行打印,但可以過濾並計算ORDER_CATEGORY的計數,這似乎對我不起作用。

 GROUPED_BY_MONTH(group-by :MONTH CON)

 ALL (for [flop GROUPED_BY_MONTH] {
    :MONTH  (:MONTH (first (second flop)))
    :ORDER1 (count (filter #(= "1" (:ORDER_CATEGORY %)) flop))
    :ORDER2 (count (filter #(= "2" (:ORDER_CATEGORY %)) flop))
})

我正在處理XML文件,這些文件已成功地管理到一個串聯列表中,並按以下方式分組:

[“ 01” [{:MONTH“ 01”,:ORDER_CATEGORY“ 1”} {:MONTH“ 01”,:ORDER_CATEGORY“ 1”} {:MONTH“ 01”,:ORDER_CATEGORY“ 2”}]] [“ 02” [{:MONTH“ 02”,:ORDER_CATEGORY“ 1”} {:MONTH“ 02”,:ORDER_CATEGORY“ 2”} {:MONTH“ 02”,:ORDER_CATEGORY“ 2”}]]

因此,我希望有:

MONTH ORDER1 ORDER2

01 -------- 2 -------------- 1

02 -------- 1 -------------- 2

這可能是我忽略的相對簡單的修復程序,因此感謝您的提前幫助!

我首先將數據轉換為:

user=> (pprint x)
[{:MONTH "01", :ORDER_CATEGORY "1"}
 {:MONTH "01", :ORDER_CATEGORY "1"}
 {:MONTH "01", :ORDER_CATEGORY "2"}
 {:MONTH "02", :ORDER_CATEGORY "1"}]

並使用功能:

user=> (defn inc1 [x] (if x (inc x) 1))
user=> (reduce (fn [acc {:keys [MONTH ORDER_CATEGORY]}]
                     (update-in acc [[MONTH ORDER_CATEGORY]] inc1)) {} x)
{["02" "1"] 1, ["01" "2"] 1, ["01" "1"] 2}

關鍵是[月份類別],值是訂單數。

您的for循環不起作用,因為您已將這樣的映射項綁定到flop

["01" [{:MONTH "01", :ORDER_CATEGORY "1"} ...]]

您的過濾器表達式會將其作為輸入:

(filter #(= "1" (:ORDER_CATEGORY %)) flop)

這將不起作用,因為:ORDER_CATEGORY都不會返回sth。 表示"01" ,也不表示序列[{:MONTH ...} ...]

鑒於綁定到flop是MapEntry,可以使用val來解決此問題:

(filter #(= "1" (:ORDER_CATEGORY %)) (val flop))

例如:

(for [flop GROUPED_BY_MONTH]
  {:MONTH  (:MONTH (first (second flop)))
   :ORDER1 (count (filter #(= "1" (:ORDER_CATEGORY %)) (val flop)))
   :ORDER2 (count (filter #(= "2" (:ORDER_CATEGORY %)) (val flop)))})
=> ({:MONTH "01", :ORDER1 2, :ORDER2 1} {:MONTH "02", :ORDER1 1, :ORDER2 0})

您還可以使用析構函數使代碼更清晰:

(for [[month maps] GROUPED_BY_MONTH]
  {:MONTH month
   :ORDER1 (count (filter #(= "1" (:ORDER_CATEGORY %)) maps))
   :ORDER2 (count (filter #(= "2" (:ORDER_CATEGORY %)) maps))})
=> ({:MONTH "01", :ORDER1 2, :ORDER2 1} {:MONTH "02", :ORDER1 1, :ORDER2 0})

請注意,通常,此解決方案更有利:

(reduce (fn [acc {:keys [MONTH ORDER_CATEGORY]}]
          (update-in acc [MONTH ORDER_CATEGORY] 
                     (fnil inc 0)))
        {} CON)
=> {"02" {"1" 1}, "01" {"2" 1, "1" 2}}

它返回一個month->order-category->count映射,該映射獨立於輸入集中存在的訂單類別和月份的種類和類型。

例如

(reduce (fn [acc {:keys [MONTH ORDER_CATEGORY]}]
          (update-in acc [MONTH ORDER_CATEGORY]
                     (fnil inc 0)))
        {} (conj CON
                 {:MONTH "01" :ORDER_CATEGORY "foo"}
                 {:MONTH "02" :ORDER_CATEGORY "foo"}
                 {:MONTH "02" :ORDER_CATEGORY "bar"}
                 {:MONTH "02" :ORDER_CATEGORY "1"}))
=> {"02" {"bar" 1, "foo" 1, "1" 2}, "01" {"foo" 1, "2" 1, "1" 2}}

但是,您應該知道,如果ORDER_CATEGORY的計數為0,則結果中沒有任何關聯的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM