【发布时间】:2015-09-21 02:51:27
【问题描述】:
这可能很简单,但我就是无法克服它。 我有一个嵌套映射的数据结构,如下所示:
(def m {:1 {:1 2 :2 5 :3 10} :2 {:1 2 :2 50 :3 25} :3 {:1 42 :2 23 :3 4}})
我需要设置每个m[i][i]=0。这在非函数式语言中很简单,但我不能让它在 Clojure 上工作。考虑到我确实有一个具有每个可能值的向量,这样做的惯用方法是什么? (姑且称之为v)
执行(map #(def m (assoc-in m [% %] 0)) v) 会起作用,但在map 的函数内使用def 似乎不正确。
将 m 变成原子版本并使用 swap! 似乎更好。但并不多它似乎也很慢。
(def am (atom m))
(map #(swap! am assoc-in[% %] 0) v)
最好/正确的方法是什么?
更新
这里有一些很棒的答案。我在Clojure: iterate over map of sets 发布了一个后续问题,与这个问题密切相关,但没有那么多。
【问题讨论】:
-
对于更复杂的情况,当更新深度嵌套的结构时,Spectre 可能会感兴趣:github.com/nathanmarz/specter | youtube.com/watch?v=mXZxkpX5nt8
标签: dictionary clojure reduce