8

重複の可能性:
マップ操作の結果として真の値のみを返す方法

偽りの値と真実の値を持つコレクションがあります。正しい値のみをカウントしたいのですが、それを行う方法はありますか?

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

4

5 に答える 5

23

真の値を保持したい場合は、次のidentity関数を使用する必要があります。

   (count (filter identity '(1 2 3 nil nil false true))) 
于 2012-09-20T19:07:30.183 に答える
8

次のように 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)))
于 2012-09-21T00:38:24.023 に答える
3

カウントしたくない値を削除するだけです。

(count (remove nil? [1 2 3 nil nil])) => 3
于 2012-09-20T18:09:16.213 に答える
2

一般的なパターンは、シーケンスをフィルタリングし、結果をカウントします

(count (filter #(if % %) [1 2 3 nil nil false]))
3 

これ#(if % %)は真実性の簡単なテストであり、それが真実であるか何か偽物である場合にのみアイテムを返します(nil)それ以外の場合

于 2012-09-20T20:10:47.480 に答える
2
(defn truthy-count [coll] 
   (reduce + 0 
     (map #(if % 1 0) coll)))

私はdAniのソリューションの方が好きだと認めますが。

于 2012-09-20T19:28:47.950 に答える