Wann verwenden Sie `zipmap` und wann` map vector`?
Ich wurde gefragt, über die Besonderheit von zipmap
konstruieren, um nur zu entdecken, dass ich offenbar etwas falsch. So habe ich gelernt, über (map vector v u)
im Prozess. Aber vor diesem Fall hatte ich zipmap zu tun (map vector ...)
's Arbeit. Hat es funktioniert, da die daraus resultierende Karte war klein genug, um aussortiert werden?
Und zu der eigentlichen Frage: was zipmap
hat, und wie/Wann es zu benutzen. Und Wann (map vector ...)
?
Meinem ursprünglichen problem erforderlich, die ursprüngliche Reihenfolge, so dass mapping nichts wäre keine gute Idee. Aber im Grunde-abgesehen von der Reihenfolge der resultierenden Paare-diese beiden Methoden sind äquivalent, weil die seq
'd-Karte wird eine Sequenz von Vektoren.
(for [pair (map vector v (rest v))]
( ... )) ;do with (first pair) and (last pair)
(for [pair (zipmap v (rest v))]
( ... )) ;do with (first pair) and (last pair)
InformationsquelleAutor der Frage progo | 2011-05-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden (zipmap ...), wenn Sie wollen direkt konstruieren eine hashmap aus getrennten Sequenzen von Schlüsseln und Werten. Die Ausgabe ist eine hashmap:
Verwenden (map vector ...), wenn Sie versuchen, Zusammenführen mehrerer Sequenzen. Die Ausgabe ist eine faul Sequenz von Vektoren:
Einige zusätzliche Hinweise zu beachten:
(into {} (map vector [:k1 :k2 :k3] [10 20 40]))
ist ziemlich gewundenen Weg, das zu tun zipmapInformationsquelleAutor der Antwort mikera
Die Methoden sind mehr oder weniger äquivalent. Wenn Sie zipmap erhalten Sie eine Karte mit Schlüssel/Wert-Paaren. Beim Durchlaufen dieser Karte erhalten Sie [key, value] - Vektoren. Die Bestellung der Karte ist jedoch nicht definiert. Mit der "Karte" - Konstrukt in der ersten Methode erstellen Sie eine Liste von Vektoren mit zwei Elementen. Die Reihenfolge ist definiert.
Zipmap vielleicht ein bisschen weniger effizient in Ihrem Beispiel. Ich würde stick mit der 'Karte'.
Bearbeiten: Oh, und zipmap ist nicht faul. Also ein weiterer Grund nicht zu verwenden in deinem Beispiel.
Edit 2: verwenden Sie zipmap, wenn Sie wirklich brauchen eine Karte, zum Beispiel für die schnelle random-Taste-basierten Zugriff.
InformationsquelleAutor der Antwort Maurits Rijk
(zipmap-k-v) nimmt zwei seqs und gibt die Karte (und nicht bewahrt Reihenfolge der Elemente)
(Karte Vektor s1, s2 ...) nimmt sich eine beliebige Anzahl von seqs und kehrt seq
verwenden Sie den zuerst, wenn Sie möchten, um zip-zwei seqs in eine Karte.
verwenden Sie die zweite, wenn Sie sich bewerben möchten Vektors (oder einer Liste oder irgendeinem anderen seq-erstellen-Formular) mehreren seqs.
gibt es einige ähnlichkeit, um die option "Sortieren", wenn Sie drucken Sie mehrere Kopien eines Dokuments 🙂
InformationsquelleAutor der Antwort zmila
Den beiden mag ähnlich Aussehen, aber in Wirklichkeit sind Sie sehr unterschiedlich.
zipmap
wird eine Karte erstellt,(map vector ...)
schafft eineLazySeq
von n-Tupeln (Vektoren der Größe n)Diese sind zwei sehr unterschiedliche Datenstrukturen.
Während der eine faul-Sequenz von 2-Tupeln möglicherweise ähnlich wie eine Karte, Sie Verhalten sich sehr unterschiedlich.
Sagen, wir sind mapping-zwei Sammlungen
coll1
undcoll2
. Betrachten wir den Fallcoll1
hat doppelte Elemente zu. Die Ausgabe vonzipmap
wird nur der Wert entspricht dem letzten Auftritt der doppelte Schlüssel incoll1
. Die Ausgabe von(map vector ...)
enthält 2-Tupel mit allen Werten der doppelte Schlüssel.Einfache REPL Beispiel:
In diesem Sinne, es ist trivial zu sehen, die Gefahr, vorausgesetzt, die folgenden:
Seq würd Karte wird eine Sequenz von Vektoren, aber nicht unbedingt die gleiche Sequenz von Vektoren, wie die Ergebnisse aus
(map vector ...)
Zur Vollständigkeit, hier sind die seq würd Vektoren sortiert:
Ich denke, die nächsten, die wir bekommen können, um eine Aussage wie die oben genannten ist:
Den
set
das Ergebnis(zip map coll1 coll2)
wird gleich dieset
das Ergebnis(map vector coll1 coll2)
wenncoll1
selbstset
.Dass es eine Menge Qualifier für zwei Operationen, die sind angeblich sehr ähnlich.
Deshalb ist Besondere Sorgfalt muss bei der Entscheidung die man zu verwenden.
Sie sind sehr unterschiedlich, dienen jedoch unterschiedlichen Zwecken und sollten nicht Synonym verwendet werden.
InformationsquelleAutor der Antwort Daniel Canas