将值列表连接到地图值的习惯用法是什么?将值列表连接到Clojure中的地图值?
这是我想要的结果,但匿名函数看起来很丑陋imo。有没有更好的办法?
> (update-in {:x #{}} [:x] #(apply conj % '(1 2)))
{:x #{1 2}}
将值列表连接到地图值的习惯用法是什么?将值列表连接到Clojure中的地图值?
这是我想要的结果,但匿名函数看起来很丑陋imo。有没有更好的办法?
> (update-in {:x #{}} [:x] #(apply conj % '(1 2)))
{:x #{1 2}}
匿名函数是不必要的
(update-in {:x #{}} [:x] conj 1 2)
;=> {:x #{1 2}}
(update-in {:x #{}} [:x] into [1 2])
;=> {:x #{1 2}}
另一个选项是'(update-in {:x#{}} [:x] clojure.set/union#{1 2})''。我更喜欢这一个,因为意图更明确(将元素添加到集合中)。 –
我把这个问题看作是通用的,一个集合只是一个示例集合,但是肯定。 –
你不应该知道地图contains?
键是否你是conj
ING值。调整您的示例...
(update-in {} [:x] #(apply conj % '(1 2)))
;{:x (2 1)}
...不是你想要的。
以下
(defn assocs [m k coll]
(assoc m k (into (get m k #{}) coll)))
...如果存在该键的条目提供一个空设定值。
(assocs {} :x [1 2])
;{:x #{1 2}}
(assocs {:x #{2}} :x [1 2])
;{:x #{1 2}}
你会在clojure.algo.graph找到类似的代码,例如here。 (警告:类型仅在其中一种算法中起作用,否则就会妨碍它)。
另外,使用矢量('[1 2]')通常比引用列表(''1 2'''''''''''''''' '(1 2)')为文字序列,因为它的内容得到评估。 – Alex