Расчет длины определенного элемента с использованием карты и фильтра - PullRequest
0 голосов
/ 04 ноября 2019

Я использовал карту и фильтр для расчета длины определенных элементов в списке троек в Dr.Racket. Я хочу вернуть количество повторений элемента в моем списке троек. Однако мой код возвращает фактическую длину троек, а не количество повторений элемента.

 (define (countStatus lst item)
      (map length (filter(lambda (x) (not(equal? x item))) lst)))

 (define lst '((joe  21  “employed”)  ( ann 19 “unemployed”)  (sue 18 “employed” ) ) )

Следующая процедура должна вернуть 2, но вместо этого возвращает длину троек.

> (countStatus lst "employed")
'(3 3 3)

1 Ответ

1 голос
/ 04 ноября 2019

Рассмотрим, что означает x в аргументе filter. Это элемент lst, что означает либо '(joe 21 "employed"), '(ann 19 "unemployed"), либо '(sue 18 "employed").

Ни один из этих элементов не равен item, равному "employed". Таким образом, вместо проверки равенства со всем элементом, вы должны проверить равенство со статусом элемента. Примерно так:

;; Example: (get-status '(joe 21 "employed")) = "employed"
(define (get-status x) (third x))

Тогда предикат для фильтрации должен проверить, равен ли статус элементу:

(lambda (x) (equal? (get-status x) item))

Обратите внимание, как он использует get-status и как он это делает не используйте not при равенстве.

После фильтрации с этим предикатом вы можете использовать length вместо map length.

;; Example: (get-status '(joe 21 "employed")) = "employed"
(define (get-status x) (third x))

(define (countStatus lst item)
  (length (filter (lambda (x) (equal? (get-status x) item)) lst)))

(define lst '((joe 21 "employed") (ann 19 "unemployed") (sue 18 "employed")))

Под этимиопределения, вы получите 2, как вы хотели:

> (countStatus lst "employed")
2
...