我有一个地图列表,其中每个键与一个字符串列表相关联。
我想将这些字符串列表中的每一个转换为集合。
(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"}})
这个问题的惯用解决方案是什么?
答案 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 Guide,fmap
已移至clojure.algo.generic.functor库的algo.generic名称空间。