我有一个这种形式的输入:
(((lady-in-water . 1.25)
(snake . 1.75)
(run . 2.25)
(just-my-luck . 1.5))
((lady-in-water . 0.8235294117647058)
(snake . 0.5882352941176471)
(just-my-luck . 0.8235294117647058))
((lady-in-water . 0.8888888888888888)
(snake . 1.5555555555555554)
(just-my-luck . 1.3333333333333333)))
(上下文:单词表示电影,数字表示用户提交的加权评分)
我需要添加所有数量并返回一个看起来像这样的列表
((lady-in-water 2.5)
(snake 2.5)
(run 2.25)
(just-myluck 2.6))
如何遍历列表和所有数量?我真的很难过。请帮助我。
谢谢。
我的做法和上面怀远的差不多,但是我更喜欢用dolist来循环:
(defun parse-ratings (all-ratings)
(let ((hash (make-hash-table)))
(dolist (rating-list all-ratings)
(dolist (rating rating-list)
(incf (gethash (car rating) hash 0)
(cdr rating))))
(maphash (lambda (key value)
(format t "total for ~a: ~a~%" key value))
hash)))
结果如下:
CL-USER> (parse-ratings '(((lady-in-water . 1.25) (snake . 1.75)
(run . 2.25) (just-my-luck . 1.5))
((lady-in-water . 0.8235294117647058)
(snake . 0.5882352941176471)
(just-my-luck . 0.8235294117647058))
((lady-in-water . 0.8888888888888888)
(snake . 1.5555555555555554)
(just-my-luck . 1.3333333333333333))))
total for LADY-IN-WATER: 2.9624183
total for SNAKE: 3.893791
total for RUN: 2.25
total for JUST-MY-LUCK: 3.6568627
NIL
CL-USER>
我是一名优秀的程序员,十分优秀!