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))
| Sysop: | Amessyroom |
|---|---|
| Location: | Fayetteville, NC |
| Users: | 74 |
| Nodes: | 6 (0 / 6) |
| Uptime: | 02:36:21 |
| Calls: | 1,194 |
| Files: | 1,353 |
| D/L today: |
2 files (1,590K bytes) |
| Messages: | 291,195 |