如何过滤 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")))]
))
这里不需要使用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"))
我在从列表中过滤掉列表时遇到问题。
给定一个列表列表,我希望它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")))]
))
这里不需要使用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"))