Вам нужно разбить проблему на две части: во-первых, преобразовать список в нечто вроде этого:
'(((lady-in-water . 1.25) (lady-in-water . 0.82) (lady-in-water . 0.88))
((snake . 1.75) ...)
...)
Я сделаю это, используя transpose
:
(define (transpose ls)
(if (null? (car ls))
'()
(cons (map car ls) (transpose (map cdr ls)))))
Тогда легко преобразовать список транспонированных фильмов в один список пар:
(define (sum-movie movie)
(cons (caar movie) (apply + (map cdr movie))))
(define (sum-movies movies)
(map sum-movie (transpose movies)))
Обратите внимание, что transpose
небезопасно: произойдет сбой, если вы пропустите фильм в одном подсписке. Кроме того, использование transpose
в первую очередь предполагает, что фильмы появляются в одном и том же порядке каждый раз.