仅计算集合中的真值

mur*_*a52 7 clojure

可能重复:
如何仅作为地图操作的结果返回truthy值

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

(数(1 2 3零无))=> 5

Dan*_*ero 22

如果你想保持truthy值只需要使用identity函数:

   (count (filter identity '(1 2 3 nil nil false true))) 
Run Code Online (Sandbox Code Playgroud)


mik*_*era 7

我建议使用reduce执行此操作,如下所示:

(defn count-truthy [coll]
  (reduce (fn [cnt val] (if val (inc cnt) cnt)) 0 coll))
Run Code Online (Sandbox Code Playgroud)

以这种方式使用reduce的原因:

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

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

(defn count-truthy [coll]
  (loop [s (seq coll) cnt 0]
    (if s
      (recur (next s) (if (first s) (inc cnt) cnt))
      cnt)))
Run Code Online (Sandbox Code Playgroud)