Dupliqué possible: strong>
Comment rendre les valeurs de la vérité À la suite d'une opération de carte p> blockQuote>J'ai une collection qui a des valeurs de fausse et de vérité. Je voudrais seulement compter les valeurs de la vérité, y a-t-il un moyen de le faire? P>
(comptage (1 2 3 nil nil)) => 5 p> blockQuote>
5 Réponses :
Il suffit de supprimer des valeurs que vous ne souhaitez pas compter.
(count (remove nil? [1 2 3 nil nil])) => 3
Légère bug: (comptez (enlever nul? [1 2 3 Nil Nil faux]) => 4
Vous pouvez résoudre ce problème en remplaçant le nil? code> avec # (si% faux vrai) code>
# (si% faux vrai) est absolument équivalent à la fonction non. (Nombre (Retirez non pas [1 2 3 NI NIL FAUX])) Retourne le résultat correct.
Si vous souhaitez conserver les valeurs de la vérité, il suffit d'utiliser la fonction identité code>:
(defn truthy-count [coll]
(reduce + 0
(map #(if % 1 0) coll)))
Although I admit I like dAni's solution better.
Le motif de Génal est filtrer la séquence et compter les résultats # (si%%%) code> est juste un court test de la véracité qui retourne un article Seulement si c'est une vérité ou quelque chose de falsy (nil) sinon p> p>
Quels avantages cela a-t-il, le cas échéant, sur le (comptage (filtre (identité code> approche?
C'est juste une façon différente d'exprimer le concept de "si cet article est en vérité" personnellement, je le trouve plus clair bien que c'est juste mon opinion
Je recommanderais de faire cela avec réduction comme suit:
(defn count-truthy [coll]
(loop [s (seq coll) cnt 0]
(if s
(recur (next s) (if (first s) (inc cnt) cnt))
cnt)))
Si vous avez déjà une séquence réalisée, vous trouverez également une bonne option, car elle bénéficiera d'arithmétiques primitives dans la boucle: P>
(defn count-truthy [coll] (reduce (fn [cnt val] (if val (inc cnt) cnt)) 0 coll))
Pas une duplicata - Compter les valeurs et les renvoyer est une opération différente (et a des solutions assez différentes)