有谁知道如何计算列表中的所有数字或字符并以这种格式成对打印:(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
)@mobyte 在 Scheme 中的解决方案 - 请注意,这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])