如果在另一个列表中找到列表?

时间:2017-03-21 09:01:04

标签: scheme racket

我开始学习Racket,但我不知道如何检查列表是否在另一个列表中找到。像(成员x(列表1 2 3 x 4 5)),但我想要#34; x"成为一系列数字。

我知道如何实现递归,但我想知道它是否存在更直接的运算符。

例如我想知道(列表3 4 5)是否在(列表1 2 3 4 5 6)中找到

5 个答案:

答案 0 :(得分:0)

我会看看这个Racket Object interface and (is-a? v type) -> boolean似乎是你在找什么?,只需在循环时使用它来捕获任何给定类型的结果并做任何事情他们

如果你想一次性捕获所有List类型,你可能还想从同一个链接查看(subclass? c cls) -> boolean

是否有可能在列表中有一个列表,这已经在列表中(1,2,(3,4,(5,6)))我担心递归是最好的解决方案但是,既然有可能存在无限量的循环,那么每次在原始列表中找到新列表时,最好在列表上运行递归,这样任何给定数量的子列表仍将被处理

答案 1 :(得分:0)

您想要搜索列表中的后续元素:

(define (subseq needle haystack)
  (let loop ((index 0)
             (cur-needle needle)
             (haystack haystack))
    (cond ((null? cur-needle) index)
          ((null? haystack) #f)
          ((and (equal? (car cur-needle) (car haystack))
                (loop index (cdr cur-needle) (cdr haystack)))) ; NB no consequence
          (else (loop (add1 index) needle (cdr haystack))))))

这将评估首先在大海捞针中找到针元素的索引,或#f如果不是。hookFooter()

答案 2 :(得分:0)

还可以使用一些字符串函数来连接列表并进行比较(需要递归):

(define (list-in-list l L)
  (define (fn ll)
    (string-join (map number->string ll))) ; Function to create a string out of list of numbers;  
  (define ss (fn l))                       ; Convert smaller list to string; 
  (let loop ((L L))                        ; Set up recursion and initial value; 
    (cond
      [(empty? L)    #f]                   ; If end of list reached, pattern is not present; 
      [(string-prefix? (fn L) ss) #t]      ; Compare if initial part of main list is same as test list;
      [else    (loop (rest L))])))         ; If not, loop with first item of list removed;

测试:

(list-in-list (list 3 4 5) (list 1 2 3 4 5 6 ))

输出:

#t

答案 3 :(得分:0)

您可以使用regexp-match检查pattern是否是另一个字符串的子字符串,方法是将两个数字列表转换为字符串,并将它们进行比较,如下所示:

(define (member? x lst)
  (define (f lst)
    (foldr string-append "" (map number->string lst)))
  (if (regexp-match (f x) (f lst)) #t #f))

f将lst(数字列表)转换为字符串。 regexp-match检查(f x)(f lst)中显示的模式。

例如,

> (member? (list 3 4 5) (list 1 2 3 4 5 6 7))
#t

答案 4 :(得分:-1)

直接来自Racket文档:

  

(member v lst [is-equal?]) → (or/c list? #f) v : any/c lst : list? is-equal? : (any/c any/c -> any/c) = equal?

找到lst的第一个元素是否相等?如果存在这样的元素,则返回以该元素开头的lst的尾部。否则,结果是#f。

或者在你的情况下:

  

(member '(3 4 5) (list 1 2 3 4 5 6 7))

其中x为'(3 4 5)(list 3 4 5)(cons 3 4 5)

如果在列表中找到x(搜索列表'(3 4 5 6 7)),则返回'(3 4 5),如果找不到,则返回false(#f

或者您可以使用assoc来检查您的x是否符合多个列表中的一个,或者:

  

(assoc x (list (list 1 2) (list 3 4) (list x 6)))

将返回:

  

'(x 6)

还有lambda结构,但我不会深入研究,因为我还不熟悉Racket。希望这会有所帮助:)

编辑:如果member给出的结果与您预期的不同,请尝试使用memq