在clojure中使用map替换vector

时间:2015-01-25 10:15:33

标签: clojure

我有一个矢量和一张地图。并且想要替换vector元素(如果它是一个map键)(用值替换键)

user=> (def v [:a :b :c :d])
#'user/v
user=> (def m {:a :k, :c :q} )
#'user/m

user=>  (reduce (fn[x y] (conj x (if (y m) (y m) y))) [] v)
[:k :b :q :d]

有没有更好的方法呢?

2 个答案:

答案 0 :(得分:6)

由于您的输入和输出是相同长度的集合,并且集合项是独立计算的,因此使用mapmapv进行矢量输出会更简单,更惯用。

(mapv (fn [x] (m x x))
      v)

或只是

(mapv #(m % %) v)

请注意,(m x x)(if (contains? m x) (m x) x)类似。

答案 1 :(得分:1)

replace完全符合您的要求:

user> (replace {:a :x :b :y} [:a :b :c :d :e :f])
[:x :y :c :d :e :f]

注意它适用于矢量作为关联集合,其中键是索引:

user> (replace [:a :b :c :d] [0 2 4 3 2 1])
[:a :c 4 :d :c :b]