Clojure中的Python setdefault函数
我试图在Clojure中做类似的事情: #增加特征/类别对的计数Clojure中的Python setdefault函数,clojure,Clojure,我试图在Clojure中做类似的事情: #增加特征/类别对的计数 def incf(self,f,cat): self.fc.setdefault(f,{}) self.fc[f].setdefault(cat,0) self.fc[f][cat]+=1 有人知道吗?首先,您不能在Clojure中变异哈希映射,因此,setdefault没有确切的对应项 但是,如果您想更新一个嵌套映射,增加给定的值(或者设置为1,如果为空),您可以利用这样一个
def incf(self,f,cat):
self.fc.setdefault(f,{})
self.fc[f].setdefault(cat,0)
self.fc[f][cat]+=1
有人知道吗?首先,您不能在Clojure中变异哈希映射,因此,
setdefault
没有确切的对应项
但是,如果您想更新一个嵌套映射,增加给定的值(或者设置为1,如果为空),您可以利用这样一个事实,即clojure.core/get
可以接受一个可选的第三个参数,该参数是默认值(并且nil
上的assoc
创建映射):
我认为一个紧密的并行是,它接受一个函数和一些默认参数值,然后返回一个函数,如果使用nil参数调用,该函数将使用默认值:
在这里,我们使用
updatein
更新输入映射中的嵌套值,并使用fnil
设置默认值0,如果它不存在,则将其递增。我确实需要更频繁地记住fnil
。我经常写(update…#(if%(f%):something))
,这很尴尬。
(defn incf [m cat f]
(let [val (get-in m [cat f] 0)]
(assoc-in m [cat f] (inc val))))
(incf {:my-cat {:a 1}} :my-cat :a) ; returns {:my-cat {:a 2}}
(incf {:my-cat {}} :my-cat :a) ; returns {:my-cat {:a 1}}
(incf {} :my-cat :a) ; returns {:my-cat {:a 1}}
(defn incf [fc f cat]
(update-in fc [f cat] (fnil inc 0)))
(incf {} :feature-foo :category-bar)
=> {:feature-foo {:category-bar 1}}