更改向量中值的一般方法

时间:2016-12-14 16:10:03

标签: clojure

如果我有

(def x [[1 2 3] [4 5 6]])

是否有一种更改任何数字的通用方法,例如9

我知道我能做到

(assoc-in x [1 1] 9) > [[1 2 3] [4 9 6]]

如果你不知道索引号,有没有办法做到这一点。或者在某种程度上首先找到索引编号,你想要的所有信息是你想要将数字5改为x中的数字9

2 个答案:

答案 0 :(得分:2)

您可以使用core replace

(mapv #(replace {5 9} %) x)
;[[1 2 3] [4 9 6]]

答案 1 :(得分:1)

其他答案适用于您的特定情况,但如果您有任意嵌套结构,则可以使用clojure.walk命名空间:

(defn replace-value
 [value replacement struct]
 (clojure.walk/prewalk
   (fn [x]
     (if (and (number? x) (== value x))
       replacement
       x)) struct))

您当然可以用任何谓词替换number?,这些谓词也可以作为arg

传递
(replace-value 5 9 [[[1 5] 6 5] 1 5 [2 5]])
;; [[[1 9] 6 9] 1 9 [2 9]]

编辑:缩略图更好的版本

(defn replace-value [value replacement struct] 
  (clojure.walk/prewalk-replace {value replacement} struct))