8
votes

Compter uniquement les valeurs de la vérité dans une collection

Dupliqué possible:
Comment rendre les valeurs de la vérité À la suite d'une opération de carte

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?

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


1 commentaires

Pas une duplicata - Compter les valeurs et les renvoyer est une opération différente (et a des solutions assez différentes)


5 Réponses :


3
votes

Il suffit de supprimer des valeurs que vous ne souhaitez pas compter.

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


3 commentaires

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? avec # (si% faux vrai)


# (si% faux vrai) est absolument équivalent à la fonction non. (Nombre (Retirez non pas [1 2 3 NI NIL FAUX])) Retourne le résultat correct.



23
votes

Si vous souhaitez conserver les valeurs de la vérité, il suffit d'utiliser la fonction identité : xxx


0 commentaires

2
votes
(defn truthy-count [coll] 
   (reduce + 0 
     (map #(if % 1 0) coll)))
Although I admit I like dAni's solution better.

0 commentaires

2
votes

Le motif de Génal est filtrer la séquence et compter les résultats xxx

# (si%%%) 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


2 commentaires

Quels avantages cela a-t-il, le cas échéant, sur le (comptage (filtre (identité 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



8
votes

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)))
  • Il est susceptible d'être plus efficace et bénéficiera de la nouvelle fonctionnalité des réducteurs de Clojure qui permet de réduire les effectifs sur de nombreuses collections li>
  • Il évite de créer une séquence intermédiaire (qui se produirait si vous avez utilisé une fonction de séquence paresseuse comme le filtre) li> ul>

    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))
    


0 commentaires