I think you are looking for assoc-in :
(def m {:a {:foo "bar"}}) (assoc-in m [:a :foo] "qux") ; => {:a {:foo "qux"}} (assoc-in m [:a :baz] "qux") ; => {:a {:foo "bar", :baz "qux"}}
update-in is similar, and maybe worth a look too. This may actually be closer to your Python example:
(def m {:a {:foo "bar"}}) (def vs {:baz "qux"}) (update-in m [:a] merge vs) ; => {:a {:foo "bar", :baz "qux"}}
Update:
Even if the key is the value of a variable (and not a compile-time constant), you can still use both update-in and assoc-in by placing the variable in a vector:
(def m {:a {:foo "bar"}}) (def k' :baz) (def v' "qux") (assoc-in m [:a k'] v') ; => {:a {:foo "bar", :baz "qux"}}
You can also programmatically create a key vector:
(def m {:a {:foo "bar"}}) (def k' :baz) (def v' "qux") (let [ks (conj [:a] k')] (assoc-in m ks v')) ; => {:a {:foo "bar", :baz "qux"}}
source share