[英]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.