2015-03-31 291 views
0

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

(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

可以为你做一些解构,所以你甚至不需要拨打第三个,但可以在第一个列表中循环使用(无零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 
4

即使Joshuas loop与解构是很整齐,我想我要补充如何改变你的代码做同样的无:

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

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

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

和另一

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

我想到了这一点,但很惊讶,与Scheme折叠不同,'reduce'只有一个列表。 – Sylwester 2015-04-02 12:57:45

+0

噢,我想知道这背后的逻辑是什么 – Baggers 2015-04-02 13:17:29