List 有没有办法检查列表中的所有元素是否都包含在racket中的另一个列表中?

List 有没有办法检查列表中的所有元素是否都包含在racket中的另一个列表中?,list,scheme,racket,List,Scheme,Racket,我想要一个函数,它可以执行如下操作: >(function '(1 2 3 4) '(1 2 3 4 5)) #t 在本例中,当返回#t时,因为第一个列表的所有元素都包含在第二个列表中。有没有一个函数可以做到这一点而不必担心顺序问题?据我所知,没有内置函数,我相信定义此类函数的最短方法是这样的 (define (list-check l1 l2) (andmap (λ(x) (not (boolean? (memq x l2)))) l1)) 据我所知,这个函数没有内置函数,我相信

我想要一个函数,它可以执行如下操作:

>(function '(1 2 3 4) '(1 2 3 4 5))
#t

在本例中,当返回#t时,因为第一个列表的所有元素都包含在第二个列表中。有没有一个函数可以做到这一点而不必担心顺序问题?

据我所知,没有内置函数,我相信定义此类函数的最短方法是这样的

(define (list-check l1 l2)
  (andmap (λ(x) (not (boolean? (memq x l2)))) l1))

据我所知,这个函数没有内置函数,我相信定义这个函数的最短方法是这样的

(define (list-check l1 l2)
  (andmap (λ(x) (not (boolean? (memq x l2)))) l1))

使用
memq
对小列表有效,但由于我们有可用的哈希表,我们不妨使用它们:

(定义(列表检查哈希l1 l2)
(定义hash(生成hasheq))
(对于每个(λ(x)(散列集!散列x#t))l2)
(andmap(λ(x)(散列参考散列x#f))l1)
;; 测试
(定义测试)
(let循环((x 1000000)(acc’())
(如果(零?x)acc(循环(子1 x)(cons x accЮЮЮ))
(列表检查哈希测试);==>#T
(列表检查哈希测试(cdr测试));=>#F
当然,您可以选择使用不可变的,因为它比
memq
更惯用,而且速度要快得多:

(定义(列表检查哈希l1 l2)
(定义hash(使hasheq(map(λ(x)(cons x#t))l2)不可变)
(andmap(λ(x)(散列参考散列x#f))l1)

使用
memq
可以在小列表上工作,但是由于我们有可用的哈希表,我们不妨使用它们:

(定义(列表检查哈希l1 l2)
(定义hash(生成hasheq))
(对于每个(λ(x)(散列集!散列x#t))l2)
(andmap(λ(x)(散列参考散列x#f))l1)
;; 测试
(定义测试)
(let循环((x 1000000)(acc’())
(如果(零?x)acc(循环(子1 x)(cons x accЮЮЮ))
(列表检查哈希测试);==>#T
(列表检查哈希测试(cdr测试));=>#F
当然,您可以选择使用不可变的,因为它比
memq
更惯用,而且速度要快得多:

(定义(列表检查哈希l1 l2)
(定义hash(使hasheq(map(λ(x)(cons x#t))l2)不可变)
(andmap(λ(x)(散列参考散列x#f))l1)

在本例中,您不是将列表作为列表进行比较,而是将其作为集合进行比较,因此使用专门设计用于这种方式的结构更有意义。Racket在其标准库中提供。这使得您正在寻找的函数变得微不足道

(define (list-subset? a b)
  (subset? (list->set a) (list->set b)))

在本例中,您不是将列表作为列表进行比较,而是作为集合进行比较,因此使用一种设计用于这种方式的结构更有意义。Racket在其标准库中提供。这使得您正在寻找的函数变得微不足道

(define (list-subset? a b)
  (subset? (list->set a) (list->set b)))

这是普通的球拍吗?订单也很重要吗?比如(函数“(12345)”(1234))返回#f?是的,第一个列表的元素必须包含在第二个列表中,这确实是返回#f。用#lang在这里玩。这是普通球拍吗?订单也很重要吗?比如(函数“(12345)”(1234))返回#f?是的,第一个列表的元素必须包含在第二个列表中,这确实是返回#f。在这里使用#lang play。太好了,memq和member是一样的吗?memq主要使用eq?用于比较的函数,它可以解决球拍后面某个地方的指针,这样你就得到了绝对相等。有很多这样的memv等。它们的比较方式不同。你可以在文档中阅读它们。每一对都是
#true
值,每一次未命中都是
#false
,所以
(和map(λ(x)(memq x l2))l1)
就足够了。太好了,memq和memq成员是一样的东西吗?大部分memq使用eq?用于比较的函数,它可以解决球拍后面某个地方的指针,这样你就得到了绝对相等。有很多这样的memv等。它们的比较方式不同。你可以在文档中阅读它们所有的信息。每一对都是
#true
值,每一次未命中都是
#false
,所以
(和map(λ(x)(memq x l2))l1)
就足够了。