リスト内のすべての数字または文字を数え、次の形式でペアで印刷する方法を知っている人はいますか:(number .number_of_occurrences)。例えば:
(カウント'(3 1 3 2 1 2 3 3 3))
((3 .5)(1 .2)(2 .2))
(カウント'(dbacbba))
((d .1)(b .3)(a .2)(c .1))
私を助けてくれてありがとう:)
ここにアイデアがあります-ハッシュテーブルを使用して、発生数を追跡します。これはO(n)
手順です:
(define (counter lst)
(let ((counts (make-hash)))
(let loop ((lst lst))
(cond ((null? lst)
(hash->list counts))
(else
(hash-update! counts (car lst) add1
(lambda () 0))
(loop (cdr lst)))))))
filter
または、 Schemeの@mobyteのソリューションのより単純なバージョン(使用しません)を次に示します。これはO(n^2)
、ハッシュテーブルベースの手順よりも効率が低いため、効率が低いことに注意してください。
(define (counter lst)
(map (lambda (e)
(cons e (count (curry equal? e) lst)))
(remove-duplicates lst)))
いずれにせよ、期待どおりに機能します。
(counter '(3 1 3 2 1 2 3 3 3))
=> '((3 . 5) (2 . 2) (1 . 2))
(counter '(d b a c b b a))
=> '((b . 3) (a . 2) (d . 1) (c . 1))
これはclojureの解決策です。しかし、私はそれが役立つことを願っています:
(defn counter [l]
(map (fn [e]
[e (count (filter #{e} l))])
(distinct l)))
(counter [3 1 3 2 1 2 3 3 3])
-> ([3 5] [1 2] [2 2])
(counter '(d b a c b b a))
-> ([d 1] [b 3] [a 2] [c 1])