2012-09-20 13 views

risposta

19

Se si desidera mantenere i valori truthy solo bisogno di utilizzare la funzione identity:

(count (filter identity '(1 2 3 nil nil false true))) 
+1

Questa risposta è eccezionale! – murtaza52

3

sufficiente rimuovere i valori che non si desidera contare.

(count (remove nil? [1 2 3 nil nil])) => 3 
+1

bug leggero: (contare (rimuovere nil? [1 2 3 nil nil false])) => 4 –

+0

è possibile risolvere questo problema sostituendo il 'nil?' Con '# (se% false true)' –

+2

# (se% false true) è assolutamente equivalente alla funzione non . (count (remove not [1 2 3 nil nil false])) restituisce il risultato corretto. – animal

2
(defn truthy-count [coll] 
    (reduce + 0 
    (map #(if % 1 0) coll))) 

Anche se ammetto che mi piace la soluzione di Dani migliore.

2

il modello Genral è filtrare la sequenza e contare i risultati

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

il #(if % %) è solo un breve test per truthyness che restituisce un oggetto solo se è truthy o qualcosa falsy (pari a zero), altrimenti

+0

Quali vantaggi ha questo, se esiste, su '(count (filter (identity' approach? – noahlz

+0

è solo un modo diverso di esprimere il concetto di" se questo elemento è vero "personalmente lo trovo più chiaro anche se questo è solo il mio opinione –

6

Suggerirei fare questo con ridurre come segue:

(defn count-truthy [coll] 
    (reduce (fn [cnt val] (if val (inc cnt) cnt)) 0 coll)) 

Motivi per l'utilizzo di ridurre in questo modo:

  • E 'probabile che sia più efficiente, e potranno beneficiare di nuove funzionalità riduttori di Clojure che consente di fatto riduce in molte collezioni
  • Si evita la creazione di una sequenza intermedia (che accadrebbe se si è utilizzato una funzione di sequenza pigri come filtro)

Se si dispone già di una sequenza realizzata, allora la seguente è anche una buona opzione, in quanto potranno beneficiare di aritmetica primitiva nel loop:

(defn count-truthy [coll] 
    (loop [s (seq coll) cnt 0] 
    (if s 
     (recur (next s) (if (first s) (inc cnt) cnt)) 
     cnt))) 
Problemi correlati