仅计算集合中的真值

时间:2012-09-20 18:06:30

标签: clojure

  

可能重复:
  how to return only truthy values as the result of a map operation

我有一个具有虚假和真实价值的集合。我想只计算真实的价值观,有没有办法做到这一点?

  

(count(1 2 3 nil nil))=> 5

4 个答案:

答案 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的原因:

  • 它可能更有效率,并将受益于Clojure的新减速器功能,可以减少许多系列的事实
  • 它避免了创建一个中间序列(如果你使用像过滤器这样的惰性序列函数会发生这种情况)

如果你已经有一个已实现的序列,那么以下也是一个不错的选择,因为它将受益于循环中的原始算法:

(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的解决方案。

相关问题