将多个元素的Conj同时转换为矢量

时间:2015-09-10 20:17:34

标签: dictionary vector clojure

我想将矢量中的元素连接到父矢量中的一些矢量中。

example:
;; I have a vector [["1" "2" "3"] ["4" "5"]]
;; and another vector ["6" "7"]

我这样做了:

(map (fn [row]
       (conj row ["6" "7"]))
     [["1" "2" "3"] ["4" "5"]])
;;=> (["1" "2" "3" ["6" "7"]] ["4" "5" ["6" "7"]])

但我希望我的结果采用以下格式:

 ;;=> (["1" "2" "3" "6" "7"] ["4" "5" "6" "7"])

请指出我正确的方向。

3 个答案:

答案 0 :(得分:1)

您不想要conj(将向量附加为元素)。您想要concatinto代替:

(map (fn [row] (concat row ["6" "7"])) [["1" "2" "3"] ["4" "5"]])
=> (("1" "2" "3" "6" "7") ("4" "5" "6" "7"))

或者更加成功:

(map #(into % ["6" "7"]) [["1" "2" "3"] ["4" "5"]])
=> (["1" "2" "3" "6" "7"] ["4" "5" "6" "7"])

into保留了向量,因此它可能是您想要的向量。请参阅文档以了解两者之间的差异。

答案 1 :(得分:1)

您的原始代码非常接近。 conj添加您传递的每个元素。所以你基本上只缺少apply

user=> (map (fn [row] (apply conj row ["6" "7"])) [["1" "2" "3"] ["4" "5"]])
(["1" "2" "3" "6" "7"] ["4" "5" "6" "7"])

答案 2 :(得分:0)

我认为以下是一个更简单的解决方案。它用  来自the Tupelo Core libraryglue函数以及for语句:

(ns xyz
  (:require [tupelo.core :as tc]....

(def data [ [1 2 3] [4 5] ] )
(tc/spyx 
  (for [curr-vec data]
    (tc/glue curr-vec [6 7] )))

;=> (for [curr-vec data] (tc/glue curr-vec [6 7])) => ([1 2 3 6 7] [4 5 6 7])