我有一个矢量和一张地图。并且想要替换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]
有没有更好的方法呢?
答案 0 :(得分:6)
由于您的输入和输出是相同长度的集合,并且集合项是独立计算的,因此使用map
或mapv
进行矢量输出会更简单,更惯用。
(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]