2

次の形式の入力があります。

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

リストとすべての数量をトラバースするにはどうすればよいですか? 私は本当に困惑しています。私を助けてください。

ありがとう。

4

4 に答える 4

2

私のアプローチは上記の huaiyuan のものと似ていますが、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> 
于 2009-07-12T00:45:46.333 に答える
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))))
于 2009-07-11T22:31:15.593 に答える
1

CL が何らかの点で優れているという誤った印象を避けるために、ハッシュ テーブル アプローチを使用した PLT スキーム ソリューションを次に示します。私はsort余分な信用のために結果の 1 つを追加しました。

(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))
于 2009-07-12T18:18:48.637 に答える
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)))))

次に、転置されたムービー リストをペアの 1 つのリストに減らすのは簡単です。

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

は安全ではないことに注意してくださいtranspose: 1 つのサブリストにムービーがない場合、クラッシュします。また、transposeそもそもの使用は、映画が毎回同じ順序で来ることを前提としています。

于 2009-07-11T21:37:23.720 に答える