9
votes

Mettre les valeurs de clé dans la carte conditionnellement, quelles sont les façons concises?

Quels sont les moyens concis / élégants de mettre dans une paire de la carte de clé de carte pour laquelle les conditions correspondantes sont vraies?

C'est pour traduire xxx

ou xxx

ou xxx

dans xxx

Je pense utiliser "Réduire" avec "Si" dans sa Lambda mais s'intéresse aux voies plus concises / belles / élégantes / idiomatiques.


0 commentaires

4 Réponses :


1
votes
(def conditions [true false true] )
(def keys [:key1 :key2 :key3])
(def vals ["value1" "value1" "value3"])


(defn testpair [cond key val]
    (when cond 
       {key val}))

(apply merge (map testpair conditions keys vals))

0 commentaires

3
votes

Pour être honnête imo, la version avec Réduire code> et si code> est déjà le plus élégant et idiomatique grève> Voir commentaire de Nickik ci-dessous.

(def c [true false true])
(def k [:a :b :c])
(def v ["v1" "v2" "v3"])

(def coll (interleave c k v))


4 commentaires

MHH sympa. Je suis venu avec quelque chose d'un peu mieux (je pense): (dans {} (pour [[[[C K V] (partition 3 Coll): quand c] [k v]))


Ah je savais qu'il y a une meilleure façon d'obtenir une carte dans une liste de vecteurs de la valeur clé :)


Je pense que l'exemple de réduction est mauvais parce que c'est vraiment difficile à lire. Utiliser 'pour' est probablement meilleur dans ce cas.


@nickik, pourriez-vous faire la réponse de votre commentaire? Je ne peux pas accepter un commentaire.



2
votes

Je penserais d'abord à cela comme comment être le meilleur possible de vos opérations fonctionnelles sur un flux:

  1. Condition de groupe / clé / valeur dans un morceau li>
  2. Filtrer les morceaux où la condition n'est pas vraie li>
  3. déposer les conditions li>
  4. aplatir les morceaux li>
  5. Créez une carte à partir du résultat LI> ol>

    qui ressemble à: p> xxx pré>

    ou si vous vous sentez filé: p> xxx pré>

    i Je ne suis pas sûr que c'est élégant ou concis, mais je pense que c'est facile à lire. Notez que si vous traitez fréquemment des données dans cette forme, vous pouvez trouver que des étapes tels que (partition 3 Coll) ou (premier%) peuvent être des fonctions réutilisables utiles à leur droite menant à quelque chose comme: P>

    (defn condition-group [coll] (partition 3 coll))
    (defn condition [group] (first group))
    (defn but-condition [group] (drop 1 group))
    (defn kv-map [kv-pairs] (apply hash-map (flatten kv-pairs)))
    
    (->> coll
         condition-group
         (filter condition)
         (map but-condition)
         kv-map)
    


0 commentaires

6
votes
(into {} (for [[c k v] (partition 3 coll) :when c] 
    [k v])) 
Based on the 'for'-Version from Kintaro but a little shorter.

0 commentaires