首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >clojure中两个映射之间的交集

clojure中两个映射之间的交集
EN

Stack Overflow用户
提问于 2014-12-26 18:52:12
回答 3查看 2.1K关注 0票数 3

我有散列图,我正试着得到钥匙之间的交点。但是函数‘交集’只对集合起作用。

所以我要得到键,把键转换成集合,然后调用交叉口,如下所示:

代码语言:javascript
复制
(intersection (set (keys map-1)) (set (keys map-2)))

有更好的方法吗?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-27 00:35:24

这可能是最简单、最简洁的方法,而且不需要构建任何集合(相对昂贵)。

代码语言:javascript
复制
(keys (select-keys map-1 (keys map-2)))

最后,一个优化的版本,它更快一些,也更难阅读:

代码语言:javascript
复制
(keep #(some->> % (find map-1) key) (keys map-2))
票数 7
EN

Stack Overflow用户

发布于 2014-12-26 20:15:34

你的解决方案既清晰又简洁。

如果要考虑性能,可以通过模仿集合/交叉口的结构来避免构造中间集。

代码语言:javascript
复制
(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))))
票数 2
EN

Stack Overflow用户

发布于 2017-03-06 19:11:48

下列内容适用于任意数量的地图

代码语言:javascript
复制
(defn key-intersection [m & ms]
  (reduce #(keys (select-keys %2 %1)) (keys m) ms))

代码语言:javascript
复制
(defn key-intersection [m & ms]
  (reduce (fn [v c] (keep #(some->> % (find c) key) v)) (keys m) ms))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27660786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档