2015-03-31 193 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