在 clojure 中使用地图替换向量

replace vector using map in clojure

我有一张矢量图和一张地图。如果向量元素是映射键,则要替换它(用值替换键)

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]

有什么更好的方法吗?

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

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

或者干脆

(mapv #(m % %) v)

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

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]