2013-05-08 6 views
5

Da Sammlung von Vektoren von getrennten Hash-KartenWie kann ich Hash-Maps, die sich in einer Sammlung von Vektoren in clojure befinden, zusammenführen?

Wie kann ich gehen aus:

[[{:a 1} {:b 2} {:c 3}] [{:a 4} {:b 5} {:c 6}] [{:a 7} {:b 8} {:c 9}]] 

An:

[[{:a 1 :b 2 :c 3}] [{:a 4 :b 5 :c 6}] [{:a 7 :b 8 :c 9}]] 

Vielen Dank für Ihre Antworten!

+2

Die Antworten als die angeforderte verschachtelte Struktur mit dem Datum gegebene Rück - ein Vektor von Vektoren, wobei jeder Vektor inneren eine einzige Karte enthält. Es ist schwer vorstellbar, warum diese Struktur notwendig ist, wenn es einfacher erscheint, mit einer Folge von Maps zu arbeiten, die von '(map (partially apply merge) input-coll) zurückgegeben würde. Welcher Aspekt der Downstream-Funktion oder API benötigt den Vektor der unitären Vektoren der Karten? –

Antwort

7
(def coll [[{:a 1} {:b 2} {:c 3}] [{:a 4} {:b 5} {:c 6}] [{:a 7} {:b 8} {:c 9}]]) 

(mapv (fn [v] [(apply merge v)]) coll) 
;; => [[{:a 1 :c 3 :b 2}] [{:a 4 :c 6 :b 5}] [{:a 7 :c 9 :b 8}]] 
+1

'mapv' (liefert einen Vektor anstelle einer Lazy-Sequenz) ist Clojure> = 4. Sayin '. –

4
(def data [[{:a 1} {:b 2} {:c 3}] [{:a 4} {:b 5} {:c 6}] [{:a 7} {:b 8} {:c 9}]]) 

(mapv #(-> [(into {} %)]) data) 
+0

Ich habe das '# (-> ...)' Idiom vorher nicht gesehen. Ist es ein Workaround für das Verhalten der Kurzschreibweise '#()', wenn ein Datenliteral wie '[]' verwendet wird? –

+0

Ja, ist es. Ich habe das noch nie in irgendeinem clojure Code gesehen, außer für meinen :) – Ankur

+1

Was ist der Vorteil gegenüber '' # (Vektor (in {}%)) ''? – sw1nn

Verwandte Themen