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?
Nick and Jake
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)))
Svein Ove Aas wrote:
> 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)))
>
Thank you Svein Ove Aas! Solved most of our problems!
/ Niklas and Jakob