Mapping einer Funktion auf die Werte einer Karte in Clojure
Ich verändern wollen, eine Karte von Werten zu einer anderen Karte mit dem gleichen Schlüssel, sondern mit einer Funktion, angewendet auf die Werte. Ich würde denken, es war eine Funktion, dies zu tun in der clojure-api, aber ich habe nicht in der Lage war, es zu finden.
Hier ist ein Beispiel für die Umsetzung dessen, was ich bin auf der Suche nach
(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}
Weiß jemand, ob map-function-on-map-vals
bereits vorhanden ist? Ich denke, es hat (wahrscheinlich mit einem schöneren Namen zu).
InformationsquelleAutor der Frage Thomas | 2009-11-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich mag deine
reduce
version ganz gut. Ich denke, es ist idiomatisch. Hier eine version mit list comprehension sowieso.InformationsquelleAutor der Antwort Brian Carper
Können Sie die
clojure.algo.generisches.Funktor/fmap
:InformationsquelleAutor der Antwort Arthur Edelstein
Hier ist eine ziemlich typische Art und Weise zu transformieren, eine Karte.
zipmap
nimmt eine Liste von Schlüssel und eine Liste von Werten und "das richtige tut" Herstellung eines neuen Clojure-map. Man könnte auch diemap
um den Schlüssel zu ändern, oder beides.oder wickeln Sie es in Ihrer Funktion:
InformationsquelleAutor der Antwort Arthur Ulfeldt
Stammt aus der Clojure Cookbook, es zu reduzieren-kv:
InformationsquelleAutor der Antwort roboli
Hier ist eine ziemlich idiomatischer Weg um dies zu tun:
Beispiel:
InformationsquelleAutor der Antwort Siddhartha Reddy
map-map
,map-map-keys
, undmap-map-values
Ich kenne keine bestehende Funktion in Clojure für diese, aber hier ist eine Implementierung der Funktion als
map-map-values
dass Sie sind frei zu kopieren. Es kommt mit zwei eng miteinander Verwandte Funktionen, diemap-map
undmap-map-keys
, die auch fehlen in der standard-Bibliothek:Nutzung
Können Sie anrufen
map-map-values
wie diese:Und die beiden anderen Funktionen wie diese:
Alternative Implementierungen
Wenn Sie nur wollen
map-map-keys
odermap-map-values
, ohne die Allgemeinemap-map
Funktion, die Sie verwenden können, diese Implementierungen, die verlassen sich nicht aufmap-map
:Auch hier ist eine alternative Implementierung von
map-map
basiert aufclojure.Spaziergang/walk
stattin
, wenn Sie dies bevorzugen Phrasierung:Parellel-Versionen –
pmap-map
usw.Gibt es auch parallele Versionen dieser Funktionen, wenn Sie Sie benötigen. So nutzen Sie einfach
pmap
stattmap
.InformationsquelleAutor der Antwort Rory O'Kane
Ich bin ein Clojure n00b, also kann es auch viel elegantere Lösungen. Hier ist meins:
Den anon func ist eine kleine 2-Liste von jeder Taste und seine f ' ed Wert. Mapcat läuft diese Funktion über die Abfolge der anzeigen die Tasten und wird das ganze Werk in eine große Liste. "gelten die hash-map" erzeugt eine neue Karte aus dieser Reihe. Die ("%m") kann schauen ein wenig seltsam, es ist Clojure idiomatisch für die Anwendung eine Taste, um eine Karte zu suchen, der entsprechende Wert.
Meisten sehr zum Lesen empfohlen: Die Clojure Cheat Sheet .
InformationsquelleAutor der Antwort Carl Smotricz
Ich mag deine
reduce
version. Mit eine sehr leichte Variante, es kann auch weiterhin die Art von Aufzeichnungen Strukturen:Den
{}
wurde ersetzt durchm
. Mit dieser änderung von Datensätzen Datensätze bleiben:Durch, beginnend mit
{}
, den Rekord verliert seine recordiness, die man vielleicht behalten wollen, wenn Sie wünschen, die record-Funktionen (compact-memory-Repräsentation für Beispiel).InformationsquelleAutor der Antwort Olivier