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

时间:2015-03-31 13:14:12

标签: list lisp common-lisp

我有两个列表,每个列表都有列表。我想从第一个列表中获取第三个值,每次从第二个列表中获取第一个值,将这些项相乘,然后将它们加到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)))

3 个答案:

答案 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*))