如何过滤 Scheme 列表中的列表?

How to filter lists in a list in Scheme?

我在从列表中过滤掉列表时遇到问题。

给定一个列表列表,我希望它return一个在第三个元素中包含特定单词的列表。

例如:如果我想查找带有单词狗的子列表列表。

EX: '(("Ben" 2 "dog")("Kath" 1 "cat")("Matt" 6 "dog"))

应该return'(("Ben" 2 "dog")("Matt" 6 "dog"))

这是我试图做的,但不幸的是它给了我一个错误。

(define (dog-only lst)
 (cond [(empty? lst) null ]
 [else (filter
 (map (equal? (car (cddr lst)) "dog")))] 
))

这里不需要使用mapfilter也不是正确的使用方法,需要传递一个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"))