2009-07-11 3 views
2

I持って、この形式のものであり、入力: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の質問を見て嬉しいです。 –

答えて

1

CLが優れているという誤った印象を避けるために、ここではハッシュtaを使用するPLT Schemeソリューションがありますブリーチアプローチ。私は追加のクレジットのために結果の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

1

は、次の2つの部分に問題を分割する必要があります:最初、このような何かにリストを変換:

'(((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は安全ではありません:1つのサブリストにムービーがない場合はクラッシュします。また、最初にtransposeを使用すると、毎回同じ順序で映画が来ると仮定します。 Common Lispでは

+0

これは面白いですが、あなたが非常に危険だと言ったように。いいね、ネイサン、ありがとう。 – unj2

1

(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

私のアプローチは、上記のをhuaiyuanに似ているが、私はループにdolistを使用して好む:

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> 
:次の出力になり

(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))) 

関連する問題