Lisp 两个列表相乘并相加两个值

Lisp two lists multiply and adding two values

我有两个列表,每个列表中都有列表。我想每次从第一个列表中获取第三个值,从第二个列表中获取第一个值,将这些项相乘,然后将它们相加求和。

(defvar *list-1* ((item1 1 4) (item2 4 5) (item3 5 8)))
(defvar *list-2* ((1) (3) (5)))

所以我想要 (1*4) + (3*5) + (5*8) = 59

到目前为止我有以下代码

(defun get-total (lst lst1)
  (loop :for element :in lst 
        :for element1 :in lst1 
        :sum (third element)))

loop 可以为你做一些解构,所以你甚至不需要调用 third,但可以循环 for (nil nil a) 在第一个列表中,它将 a 绑定到第三个值。您可以对第二个列表执行相同的操作,但解构列表列表 (b) 除外。那么你将拥有:

(loop :for (nil nil a)  :in '((item1 1 4) (item2 4 5) (item3 5 8)) 
      :for (b)          :in '((1) (3) (5))
      :summing (* a b))
;=> 59

尽管 Joshuas loop 的解构非常简洁,但我想我会添加如何更改代码以在没有解构的情况下执行相同的操作:

(defun get-total (lst1 lst2)      
  (loop :for element1 :in lst1 
        :for element2 :in lst2
        :sum (* (third element1) (first element2)))

为了好玩,这是一个非循环版本

(reduce #'+ (mapcar #'* (mapcar #'third *list-1*)
                        (mapcar #'first *list-2*)))

还有一个

(reduce #'+ (mapcar (lambda (x y) (* (third x) (first y)))
                    *list-1* *list-2*))