[英]Filtering in Clojure
我有这样的地图
(def invoice
{:productId ["001" "002" "003" "004" "005" "006" "007" "008" "009" "010"],
:price ["50" "60" "70" "50" "40" "45" "55" "90" "50" "70"],
:quantity ["0" "0" "1" "2" "0" "0" "0" "0" "0" "1"]})
我如何过滤所以它只显示数量为1或更多的产品ID?
我已经试过这样做了
(filter (> (invoice :quantity %) 1) (map list (invoice :price) (invoice :quantity) (invoice :productid))
但它不起作用
您需要创建一个函数作为第一个参数传递给filter
。 其次,在进行比较之前需要先解析数量,然后使用read-string
:
(filter #(> (read-string (second %)) 1) (map list (invoice :price) (invoice :quantity) (invoice :productId)))
第一步是构建一对产品ID和数量:
(map vector (invoice :quantity) (invoice :productId))
;; ["0" "001"] .... first element would be quantity and second is productiID
第二步将过滤掉哪个数量大于0,这里我使用(整数.xx)将数量转换为数字。
(filter #(> (Integer. (first %)) 0) (map vector (invoice :quantity) (invoice :productId)))
通常,当数据更“正常”时,数据更容易处理,因此您不必担心样本中的索引。 我建议将其存储为({:id x:price y:quant z} ...)的seq。
这个功能可以做到:
(defn invoices [invoice]
(map (fn [id price quant]
{:id id
:price price
:quant quant}) (:prouctId invoice)
(:price invoice)
(:quantity invoice))
然后从那里你可以简单地
(->> invoice
invoices
(remove #(= "0" (:price %)) ;; remove "0" prices
(map :id))) ;; get ids
假设您的数据集没有负数量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.