我有散列图,我正试着得到钥匙之间的交点。但是函数‘交集’只对集合起作用。
所以我要得到键,把键转换成集合,然后调用交叉口,如下所示:
(intersection (set (keys map-1)) (set (keys map-2)))有更好的方法吗?
谢谢
发布于 2014-12-27 00:35:24
这可能是最简单、最简洁的方法,而且不需要构建任何集合(相对昂贵)。
(keys (select-keys map-1 (keys map-2)))最后,一个优化的版本,它更快一些,也更难阅读:
(keep #(some->> % (find map-1) key) (keys map-2))发布于 2014-12-26 20:15:34
你的解决方案既清晰又简洁。
如果要考虑性能,可以通过模仿集合/交叉口的结构来避免构造中间集。
(defn key-intersection [s1 s2]
(if (< (count s2) (count s1))
(recur s2 s1)
(reduce
(fn [result item]
(if (contains? s2 item)
(conj result item)
result))
#{}
(keys s1))))发布于 2017-03-06 19:11:48
下列内容适用于任意数量的地图
(defn key-intersection [m & ms]
(reduce #(keys (select-keys %2 %1)) (keys m) ms))或
(defn key-intersection [m & ms]
(reduce (fn [v c] (keep #(some->> % (find c) key) v)) (keys m) ms))https://stackoverflow.com/questions/27660786
复制相似问题