将列表转换为Clojure中列表映射列表中的集合

时间:2013-12-10 17:12:17

标签: clojure

我有一个地图列表,其中每个键与一个字符串列表相关联。

我想将这些字符串列表中的每一个转换为集合。

(def list-of-maps-of-lists '({:a ["abc"]} {:a ["abc"]} {:a ["def"]} {:x ["xyz"]} {:x ["xx"]}))

这是我迄今为止的最佳尝试:

(flatten (map (fn [amap] (for [[k v] amap] {k (set v)})) list-of-maps-of-lists))

=> ({:a #{"abc"}} {:a #{"abc"}} {:a #{"def"}} {:x #{"xyz"}} {:x #{"xx"}})

这个问题的惯用解决方案是什么?

2 个答案:

答案 0 :(得分:4)

非常与您的解决方案类似。

使用列表理解:

(map
  #(into {} (for [[k v] %] [k (set v)]))
  list-of-maps-of-lists)

替代:

(map
  #(zipmap (keys %) (map set (vals %)))
  list-of-maps-of-lists) 

答案 1 :(得分:2)

我更喜欢使用clojure.contrib中的fmap函数解决此类问题:

(map (partial fmap set)
     list-of-maps-of-lists)

更新:根据This Migration Guidefmap已移至clojure.algo.generic.functor库的algo.generic名称空间。