K Isn't Lisp

2 days ago 1
Niklas Brunberg wrote: > We have a list of elements, some are duplicates. We're trying to figure > out how to find the duplicate elements and increase a counter value by 1 > for each instance of the element found. The list consists of lists with > two elements, the first being the incremental counter, the second being > the string sought. Example: > > ((1 "one") (1 "two") (1 "three") (1 "one") (1 "four") (1 "two")) > > The result should be: > > ((2 "one") (2 "two") (1 "three") (1 "four")) > > > This is the function for adding 1 (incremental counter element): > > (defun add-one-to-n (indata) >    (setq n (car indata)) >    (setq outdata >      (cons (+ 1 n) (cdr indata)))) > > Any ideas on how we should go about achieving this? I'd use a hash table, much like this: (defun count (list)   (let ((hash (make-hash-table)))     (dolist (el list)       (incf (gethash (cadr el) hash 0) (car el)))     (let (result)       (maphash (lambda (key val)                  (push (list val key) result))          hash)       result)))
Read Entire Article