我开始学习Racket,但我不知道如何检查列表是否在另一个列表中找到。像(成员x(列表1 2 3 x 4 5)),但我想要#34; x"成为一系列数字。
我知道如何实现递归,但我想知道它是否存在更直接的运算符。
例如我想知道(列表3 4 5)是否在(列表1 2 3 4 5 6)中找到
答案 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