Sysop: | Amessyroom |
---|---|
Location: | Fayetteville, NC |
Users: | 40 |
Nodes: | 6 (0 / 6) |
Uptime: | 11:04:54 |
Calls: | 291 |
Files: | 910 |
Messages: | 76,430 |
Is there a standard Lisp function that will take a list and return an associative list representing the symbol frequency in the original list? For example, (frequency '(a (a (b) a))) => ((a . 3) (b . 1)). Any help would be greatly appreciated.
Thank you.
Coincidentally, someone else asked the same question earlier today.
(defun occurrences (list &key (test #'eql))
(if (consp list)
(let (alist)
(labels ((occurrences-aux (object)
(cond ((null object))
((consp object)
(occurrences-aux (first object))
(occurrences-aux (rest object)))
(t
(let ((count (assoc object alist :test test)))
(if (null count)
(setf alist (acons object 1 alist))
(incf (rest count))))))))
(occurrences-aux (first list))
(occurrences-aux (rest list)))
alist)))
(occurrences '(a (a (a b c) b c) b . c))((C . 3) (B . 3) (A . 3))