在clojure中使用map替换vector

Dan*_* Wu 4 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]
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

The*_*Fox 6

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

(mapv (fn [x] (m x x))
      v)
Run Code Online (Sandbox Code Playgroud)

或者干脆

(mapv #(m % %) v)
Run Code Online (Sandbox Code Playgroud)

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

  • 小修正:`(get mxx)`等于`(if(contains?mx)(mx)x)`(参见`(get {:x nil}:x:x)`).此外,您可以将函数缩短为"#(m %%)",因为map实现了`IFn`,因此可以直接用于查找. (2认同)
  • 谢谢,我不知道hash-map作为函数也有一个"未找到"的值. (2认同)