在 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]
有什么更好的方法吗?
由于您的输入和输出是相同长度的集合,并且集合项是独立计算的,因此使用 map
或 mapv
进行矢量输出会更简单、更符合习惯。
(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]
我有一张矢量图和一张地图。如果向量元素是映射键,则要替换它(用值替换键)
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]
有什么更好的方法吗?
由于您的输入和输出是相同长度的集合,并且集合项是独立计算的,因此使用 map
或 mapv
进行矢量输出会更简单、更符合习惯。
(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]