如果我有
(def x [[1 2 3] [4 5 6]])
是否有一种更改任何数字的通用方法,例如9
我知道我能做到
(assoc-in x [1 1] 9) > [[1 2 3] [4 9 6]]
如果你不知道索引号,有没有办法做到这一点。或者在某种程度上首先找到索引编号,你想要的所有信息是你想要将数字5改为x中的数字9
答案 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))