2014-11-12 2 views
0

У меня есть два вектора [: v1: v2: v3] [: V1: V2: V3], я хотел бы создать вектор в формате:Clojure: слияния двух векторов в одну карту с новыми ключами и значениями

[ [:key "v1" :value "V1"] 
    [:key "v2" :value "V2"] 
    [:key "v3" :value "V3"] 
    ] 
+0

Ваше название говорит, что вы хотите карту. Но вопрос показывает решение как вектор. Вы действительно хотите '{" v3 "" V3 "," v2 "" V2 "," v1 "" V1 "}'? – Thumbnail

+0

Вектор '[: ключ" v1 ": значение" V1 "]' не имеет ключа или значения. это индексированная последовательность из четырех плоских значений: два ключевых слова, чередующиеся с двумя строками. – Thumbnail

ответ

3
(mapv (fn [k v] [:key (name k) :value (name v)]) 
    [:v1 :v2 :v3] [:V1 :V2 :V3]) 
+0

Вы испортили мой шанс получить мой первый ответ clojure! : '- (Just kidding, +1 – zerkms

1

ради разнообразия:

(into [] (zipmap (map name [:v1 :v2 :v3]) (map name [:V1 :V2 :V3]))) 
+0

'zipmap' не сохраняет порядок вставки последовательности, замените его на« вектор карты »? – Thumbnail

1

Если, как предполагает заголовок, противоречащее текст вопроса, вы на самом деле хотите карту {"v3" "V3", "v2" "V2", "v1" "V1"}, то

(zipmap [:v1 :v2 :v3] [:V1 :V2 :V3]) 

... даст вам

{:v3 :V3, :v2 :V2, :v1 :V1} 

Вы должны преобразовать каждый элемент его имя первым:

(->> [[:v1 :v2 :v3] [:V1 :V2 :V3]] 
    (map (partial map name)) 
    (apply zipmap)) 

;{"v3" "V3", "v2" "V2", "v1" "V1"} 
Смежные вопросы