Je veux transformer une carte de valeurs en une autre carte avec les mêmes clés mais avec une fonction appliquée aux valeurs. Je penserais qu'il y avait une fonction pour faire cela dans l'api clojure, mais je n'ai pas pu la trouver.
Voici un exemple d'implémentation de ce que je recherche
(defn map-function-on-map-vals [m f]
(reduce (fn [altered-map [k v]] (assoc altered-map k (f v))) {} m))
(println (map-function-on-map-vals {:a "test" :b "testing"} #(.toUpperCase %)))
{:b TESTING, :a TEST}
Est-ce que quelqu'un sait s'il map-function-on-map-vals
existe déjà? Je pense que c'est le cas (probablement avec un nom plus joli aussi).
dictionary
clojure
map-function
Thomas
la source
la source
map
pour une raison quelconque.Vous pouvez utiliser
clojure.algo.generic.functor/fmap
:la source
org.clojure/algo.generic "0.1.0"
l'exemple devrait maintenant se lire:(use '[clojure.algo.generic.functor :only (fmap)]) (fmap inc {:a 1 :b 3 :c 5})
fmap
dans ClojureScript?Voici une manière assez typique de transformer une carte.
zipmap
prend une liste de clés et une liste de valeurs et "fait ce qu'il faut" en produisant une nouvelle carte Clojure. Vous pouvez également placer lesmap
touches autour des touches pour les changer, ou les deux.ou pour conclure dans votre fonction:
la source
Tiré du livre de cuisine Clojure, il y a réduire-kv:
la source
Voici une façon assez idiomatique de faire cela:
Exemple:
la source
map-map
,map-map-keys
etmap-map-values
Je ne connais aucune fonction existante dans Clojure pour cela, mais voici une implémentation de cette fonction car
map-map-values
vous êtes libre de copier. Il est livré avec deux fonctions étroitement liées,map-map
etmap-map-keys
, qui sont également absentes de la bibliothèque standard:Usage
Vous pouvez appeler
map-map-values
comme ceci:Et les deux autres fonctions comme celle-ci:
Implémentations alternatives
Si vous voulez seulement
map-map-keys
oumap-map-values
, sans lamap-map
fonction plus générale , vous pouvez utiliser ces implémentations, qui ne reposent pas surmap-map
:En outre, voici une implémentation alternative de
map-map
qui est basée surclojure.walk/walk
au lieu deinto
, si vous préférez cette formulation:Versions parallèles -
pmap-map
, etc.Il existe également des versions parallèles de ces fonctions si vous en avez besoin. Ils utilisent simplement à la
pmap
place demap
.la source
Je suis un Clojure n00b, il peut donc y avoir des solutions bien plus élégantes. Voici la mienne:
La fonction anon fait une petite liste de 2 à partir de chaque clé et de sa valeur f'ed. Mapcat exécute cette fonction sur la séquence des touches de la carte et concatène l'ensemble des travaux en une seule grande liste. "apply hash-map" crée une nouvelle carte à partir de cette séquence. Le (% m) peut sembler un peu bizarre, c'est Clojure idiomatique pour appliquer une clé à une carte pour rechercher la valeur associée.
Lecture la plus fortement recommandée: The Clojure Cheat Sheet .
la source
la source
J'aime ta
reduce
version. Avec une très légère variation, il peut également conserver le type de structures d'enregistrements:Le a
{}
été remplacé parm
. Avec ce changement, les enregistrements restent des enregistrements:En commençant par
{}
, l'enregistrement perd son caractère d' enregistrement , que l'on peut souhaiter conserver, si vous désirez les capacités d'enregistrement (représentation de mémoire compacte par exemple).la source
Je me demande pourquoi personne n'a mentionné le spectre bibliothèque de . Il a été écrit pour rendre ce type de transformation facile à coder (et, plus important encore, le code écrit facile à comprendre), tout en étant toujours très performant:
Écrire une telle fonction dans Clojure pur est simple, mais le code devient beaucoup plus délicat une fois que vous passez à un code hautement imbriqué composé de différentes structures de données. Et c'est là que spectre entre en jeu.
Je recommande de regarder cet épisode sur Clojure TV qui explique la motivation derrière et les détails du spectre .
la source
Clojure 1.7 ( publié le 30 juin 2015) offre une solution élégante pour cela avec
update
:la source