如何基于索引列表替换向量的多个元素

时间:2016-04-28 12:38:55

标签: clojure

用[“a”“b”“r”“d”“r”]如何用索引2和4替换值为“mark”的值,以便[“a”“b”“标记“”d“”mark“]就是结果。候选替换的值是未知的,只是指数是已知的。

尝试将map与列表(2 4)一起使用会产生多个向量。 assoc也不适用于存在多个索引的实例。

2 个答案:

答案 0 :(得分:3)

将新项目与相应的索引相关联:

(assoc ["a" "b" "r" "d" "r"] 2 "mark" 4 "mark")

或使其更健壮:

(apply assoc ["a" "b" "r" "d" "r"] (interleave [2 4] (repeat "mark")))

或使用reduce:

(reduce #(assoc %1 %2 "mark")
        ["a" "b" "r" "d" "r"]
        [2 4])

答案 1 :(得分:1)

功能定义:

(defn replace-indexed [smap coll]
  (map-indexed (fn [i e] (get smap i e)) coll))

用法:

user> (replace-indexed {2 "mark" 4 "mark"} ["a" "b" "r" "d" "r"])
;; => ("a" "b" "mark" "d" "mark")

结果是序列,而不是矢量。