如何构建集合的哈希映射

时间:2014-11-16 07:28:17

标签: clojure

我认为我正在努力克服一些基本的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中这样做?

3 个答案:

答案 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-inconj将值添加到地图中,并确保使用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}}