我有两个列表,每个列表都有列表。我想从第一个列表中获取第三个值,每次从第二个列表中获取第一个值,将这些项相乘,然后将它们加到sum中。
(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)))
答案 0 :(得分:4)
即使具有解构的Joshuas loop
非常整洁,我想我还要添加如何在不使用的情况下更改代码:
(defun get-total (lst1 lst2)
(loop :for element1 :in lst1
:for element2 :in lst2
:sum (* (third element1) (first element2)))
答案 1 :(得分:3)
循环可以为您做一些解构,所以您甚至不需要调用第三,但可以循环(nil nil a)< / strong>在第一个列表中,它将 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
答案 2 :(得分:0)
只是为了好玩,这是一个非循环版本
(reduce #'+ (mapcar #'* (mapcar #'third *list-1*)
(mapcar #'first *list-2*)))
和另一个
(reduce #'+ (mapcar (lambda (x y) (* (third x) (first y)))
*list-1* *list-2*))