首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在elisp中多个列表的交集

在elisp中多个列表的交集
EN

Stack Overflow用户
提问于 2015-07-15 01:20:04
回答 2查看 1.1K关注 0票数 5

如何使用elisp获得多个列表的交集?我是一个新手,但我想象有一些内置的函数或一个更好的解决方案使用的减少。我把这个拼凑在一起,但看起来太复杂了。

代码语言:javascript
复制
;; get the intersection of these lists
;; result should be (3 4 5)
(setq test '((0 1 2 3 4 5) (2 3 4 5 6) (3 4 5 6 7)))

(require 'cl-lib)
(cl-remove-if-not
 (lambda (x) (cl-every
         (lambda (y) (> (length (memq x y) ) 0 ) )
         (cdr test) ) )
 (car test) )
;; ( 3 4 5)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-15 05:56:29

有一个只使用两个操作数的cl-intersection

代码语言:javascript
复制
(cl-intersection '(0 1 2 3 4 5) '(2 3 4 5 6))

您可以使用它来定义您自己的交集:

代码语言:javascript
复制
(defun my-intersection(l)
    (cond ((null l) nil)
          ((null (cdr l)) (car l))
          (t (cl-intersection (car l) (my-intersection (cdr l))))))

(my-intersection '((0 1 2 3 4 5) (2 3 4 5 6) (3 4 5 6 7)))

更新的

由于下面的@Tobias注释,您可以在新函数中使用cl-intersection的相同关键字参数,即(:test :test-not :key),并将它们传播到递归中对它的所有调用。

以下是扩展版本:

代码语言:javascript
复制
(defun my-intersection(l &rest cl-keys)
    (cond ((null l) nil)
          ((null (cdr l)) (car l))
          (t (apply 'cl-intersection (car l) (apply 'my-intersection (cdr l) cl-keys) cl-keys))))
票数 7
EN

Stack Overflow用户

发布于 2015-08-18 12:08:18

安装破折号第三方列表操作库(按照使用说明安装)。那么你需要:

代码语言:javascript
复制
(-reduce '-intersection '((1 2 3 4) (2 3 4 5) (3 4 5 6))) ; => (3 4)

如果需要接受可变列表数的函数,而不是单个列表列表,请使用&rest关键字将其包装在函数中,如下所示:

代码语言:javascript
复制
(defun -intersection* (&rest list-of-lists)
  (-reduce '-intersection list-of-lists))
;; (-intersection* '(1 2 3 4) '(2 3 4 5) '(3 4 5 6)) ; => (3 4)

如果这是您第一次使用-reduce,那么它就是一个“折叠”函数:它接受一个二进制函数,一个元素列表,并将它们缩减为最终结果--每次一个list元素。这个答案解释了折叠背后的概念。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31419943

复制
相关文章

相似问题

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