Scheme 如何筛选方案中列表中的列表?
我在从列表中筛选列表时遇到问题 给定一个列表列表,我希望它返回一个在第三个元素中包含某个单词的列表 例如:如果我想找到包含单词dog的子列表 例如:Scheme 如何筛选方案中列表中的列表?,scheme,racket,Scheme,Racket,我在从列表中筛选列表时遇到问题 给定一个列表列表,我希望它返回一个在第三个元素中包含某个单词的列表 例如:如果我想找到包含单词dog的子列表 例如:”(“本”2“狗”)(“凯丝”1“猫”)(“马特”6“狗”) 应该返回”(“Ben”2“dog”)(“Matt”6“dog”) 这是我试图做的,但不幸的是,它给了我一个错误 (define (dog-only lst) (cond [(empty? lst) null ] [else (filter (map (equal? (car (cdd
”(“本”2“狗”)(“凯丝”1“猫”)(“马特”6“狗”)
应该返回”(“Ben”2“dog”)(“Matt”6“dog”)
这是我试图做的,但不幸的是,它给了我一个错误
(define (dog-only lst)
(cond [(empty? lst) null ]
[else (filter
(map (equal? (car (cddr lst)) "dog")))]
))
这里不需要使用
map
,这不是使用filter
的正确方法,需要将lambda
作为参数传递。另外,当lst
为空时,您不需要单独的条件来处理该情况。试试这个:
(define lst '(("Ben" 2 "dog") ("Kath" 1 "cat") ("Matt" 6 "dog")))
(filter (lambda (e) (equal? (caddr e) "dog")) lst)
=> '(("Ben" 2 "dog") ("Matt" 6 "dog"))
map
接受函数,而不是表达式
(define test '(("Ben" 2 "dog") ("Kath" 1 "cat") ("Matt" 6 "dog")))
(define (dog? e)
(and (pair? e)
(>= 3 (length e))
(equal? (caddr e) "dog")))
(dog? (car test)) ; ==> #t
(dog? (cadr test)) ; ==> #f
(define (dogs animals)
(filter dog? animals))
(dogs test)
; ==> (("Ben" 2 "dog") ("Matt" 6 "dog"))