可能重复:
how to return only truthy values as the result of a map operation
我有一个具有虚假和真实价值的集合。我想只计算真实的价值观,有没有办法做到这一点?
(count(1 2 3 nil nil))=> 5
答案 0 :(得分:21)
如果你想保持真实价值,只需要使用identity
功能:
(count (filter identity '(1 2 3 nil nil false true)))
答案 1 :(得分:7)
我建议使用reduce执行此操作,如下所示:
(defn count-truthy [coll]
(reduce (fn [cnt val] (if val (inc cnt) cnt)) 0 coll))
以这种方式使用reduce的原因:
如果你已经有一个已实现的序列,那么以下也是一个不错的选择,因为它将受益于循环中的原始算法:
(defn count-truthy [coll]
(loop [s (seq coll) cnt 0]
(if s
(recur (next s) (if (first s) (inc cnt) cnt))
cnt)))
答案 2 :(得分:3)
只需删除您不想计算的值。
(count (remove nil? [1 2 3 nil nil])) => 3
答案 3 :(得分:2)
(defn truthy-count [coll]
(reduce + 0
(map #(if % 1 0) coll)))
虽然我承认我更喜欢dAni的解决方案。