我认为我正在努力克服一些基本的clojure不可变哈希映射。
我想将元组列表转换为哈希映射
([:a 2] [:b 3] [:a 1] [:b 3]) ==> {:a #{2 1}, :b #{3}}
也就是说,在python中我会这样做:
hash_map = defaultdict(set)
for key, value in my_list:
hash_map[key].add(value)
我应该如何在clojure中这样做?
答案 0 :(得分:2)
哦,有很多有用的Clojure功能可以触摸:
(reduce
(fn [m [k v]]
(update-in m [k] (fnil conj #{}) v))
{} data)
;; => {:b #{3}, :a #{1 2}}
它实际上非常接近Python代码:您使用reduce
迭代seq,使用update-in
和conj
将值添加到地图中,并确保使用fnil
初始化值使用{{1}}的空集。
答案 1 :(得分:0)
(defn pairs-to-hash [pairs]
(into {}
(map (fn [kv]
[(key kv) (->> kv val (map second) set)])
(group-by first pairs))))
(pairs-to-hash '([:a 2] [:b 3] [:a 1] [:b 3]))
这是一个快速的尝试,我认为可以加强一点。
答案 2 :(得分:0)
缓慢但确定:
(defn pairs-to-graph [pairs]
(apply merge-with clojure.set/union
(map (fn [[k v]] {k #{v}}) pairs)))
(pairs-to-graph '([:a 2] [:b 3] [:a 1] [:b 3]))
;{:b #{3}, :a #{1 2}}