2009-07-11 62 views
2

我有一個輸入,其是這樣的形式:如何增加了元件,用於在計劃/結構的Lisp

(((lady-in-water . 1.25) 
    (snake . 1.75) 
    (run . 2.25) 
    (just-my-luck . 1.5)) 
((lady-in-water . 0.8235294117647058) 
    (snake . 0.5882352941176471) 
    (just-my-luck . 0.8235294117647058)) 
((lady-in-water . 0.8888888888888888) 
    (snake . 1.5555555555555554) 
    (just-my-luck . 1.3333333333333333))) 

(上下文:字表示一個電影和數字表示提交的加權評分用戶)

我需要添加所有的數量和返回這看起來是這樣的

((lady-in-water 2.5) 
(snake 2.5) 
(run 2.25) 
(just-myluck 2.6)) 

列表如何遍歷目錄和所有的數量?我真的很難過。請幫幫我。

謝謝。

+0

我愛Lisp。它總是讓我很高興在這裏看到Lisp的問題。 – 2009-07-12 18:28:28

回答

1

爲了避免錯誤的印象,CL以任何方式優越,這裏是一個PLT計劃解決方案,使用hashta ble方法。我已經添加了sort的額外功勞。

(define (data->movies data) 
    (define t (make-hasheq)) 
    (for* ([x (in-list data)] [x (in-list x)]) 
    (hash-set! t (car x) (+ (cdr x) (hash-ref t (car x) 0)))) 
    (sort (hash-map t cons) > #:key cdr)) 
+0

一如既往,這真是太棒了。每個人都向你的新主人低頭。 – unj2 2009-07-12 18:25:14

1

你需要把問題分解成兩個部分:第一,改造名單弄成這個樣子:

'(((lady-in-water . 1.25) (lady-in-water . 0.82) (lady-in-water . 0.88)) 
    ((snake . 1.75) ...) 
    ...) 

我會做,使用transpose

(define (transpose ls) 
    (if (null? (car ls)) 
     '() 
     (cons (map car ls) (transpose (map cdr ls))))) 

然後很容易將移調電影列表減少爲單個列表對:

(define (sum-movie movie) 
    (cons (caar movie) (apply + (map cdr movie)))) 
(define (sum-movies movies) 
    (map sum-movie (transpose movies))) 

請注意, transpose是不安全的:如果您在一個子列表中缺少一部電影,它會崩潰。另外,首先使用transpose假定電影每次都以相同的順序進來。

+0

這很有趣,但就像你說的很危險。但一個很好的人,納森,謝謝。 – unj2 2009-07-12 02:58:41

1

Common Lisp中:

(defun marginalize (data) 
    (let ((table (make-hash-table))) 
    (loop for row in data do 
     (loop for (k . v) in row do 
     (incf (gethash k table 0.0) v))) 
    (loop for k being the hash-key of table using (hash-value v) 
      collect (cons k v)))) 
2

我的做法是類似於懷遠的上面,但我更喜歡使用dolist循環:

(defun parse-ratings (all-ratings) 
    (let ((hash (make-hash-table))) 
    (dolist (rating-list all-ratings) 
     (dolist (rating rating-list) 
     (incf (gethash (car rating) hash 0) 
       (cdr rating)))) 
    (maphash (lambda (key value) 
       (format t "total for ~a: ~a~%" key value)) 
      hash))) 

導致下面的輸出:

CL-USER> (parse-ratings '(((lady-in-water . 1.25) (snake . 1.75) 
          (run . 2.25) (just-my-luck . 1.5)) 
         ((lady-in-water . 0.8235294117647058) 
          (snake . 0.5882352941176471) 
          (just-my-luck . 0.8235294117647058)) 
         ((lady-in-water . 0.8888888888888888) 
          (snake . 1.5555555555555554) 
          (just-my-luck . 1.3333333333333333)))) 
total for LADY-IN-WATER: 2.9624183 
total for SNAKE: 3.893791 
total for RUN: 2.25 
total for JUST-MY-LUCK: 3.6568627 
NIL 
CL-USER>