Hippe013 Posted August 16, 2010 Posted August 16, 2010 Hello everyone, I have a list of integers representing the number of times a number occurs. such as: ( 4 6 2 8 10 13 12 3 9 1) For instance the number 1 occured 4 times, number 2 occured 6 times, and the number 3 occured 2 times and so fourth where the first item in the list reprsents 1 and so on. What I am trying to do is retrieve the top five numbers that occured the most. In this case it would be: 6 @ 13 occurrences, 7 @ 12 occurrences, 5 @ 10 occurrences, 9 @ 9 occurrences and 4 @ 8 occurrences. I am trying to create a function that given a list would return these top five numbers in a constructed list. ie ((6 . 13)(7 . 12)(5 . 10)(9 . 9)(4 . 8 )) Any help would be greatly appreciated. Regards Hippe013 Quote
Tharwat Posted August 16, 2010 Posted August 16, 2010 Here is a start ... (setq a (list 4 6 2 8 10 13 12 3 9 1)) (cons (nth 1 a) 13) (cons (nth 8 a) 9) Regards, Tharwat Quote
rkmcswain Posted August 16, 2010 Posted August 16, 2010 Thinking out loud here... Maybe use the (apply) and (max) functions to return the maximum value and it's place, then remove this value from the list and repeat, building the cons list each iteration....? Quote
jammie Posted August 16, 2010 Posted August 16, 2010 Not heavily tested but maybe it will give you some ideas (vl-load-com) ;Input - List of numbers ;Retval - List of dotted pairs sorted by occurence ;Sample - (sort_by_occurence (list 1 2 1 1 1 2 3 2 2 2 2 2 3 4 55 1 3 4)) -> ; ((2 . 7) (1 . 5) (3 . 3) (4 . 2) (55 . 1)) ; 2 occurs 7 times, 1 occurs 5 times etc..... (defun sort_by_occurence (<list> / tempList) (foreach n <list> (setq tempList (if (setq item (assoc n tempList)) (subst (cons (car item) (1+ (cdr item))) item tempList) (append tempList (list (cons n 1)))))) (vl-sort tempList (function (lambda (e1 e2) (> (cdr e1) (cdr e2))))) ) Regards Jammie Quote
David Bethel Posted August 16, 2010 Posted August 16, 2010 Kind of a kudge, but it's a start: [b][color=BLACK]([/color][/b]defun datom [b][color=FUCHSIA]([/color][/b]at lst / nlst[b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]and [b][color=NAVY]([/color][/b]listp lst[b][color=NAVY])[/color][/b] [b][color=NAVY]([/color][/b]> [b][color=MAROON]([/color][/b]length lst[b][color=MAROON])[/color][/b] 0[b][color=NAVY])[/color][/b] [b][color=NAVY]([/color][/b]foreach a lst [b][color=MAROON]([/color][/b]if [b][color=GREEN]([/color][/b]not [b][color=BLUE]([/color][/b]equal at a[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]setq nlst [b][color=BLUE]([/color][/b]cons a nlst[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]reverse nlst[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b] [b][color=BLACK]([/color][/b]setq tmp nil rl nil tl nil[b][color=BLACK])[/color][/b] [b][color=BLACK]([/color][/b]setq l [b][color=FUCHSIA]([/color][/b]list 4 6 2 8 10 13 12 3 9 1[b][color=FUCHSIA])[/color][/b] tl l i 1[b][color=BLACK])[/color][/b] [b][color=BLACK]([/color][/b]while [b][color=FUCHSIA]([/color][/b]> [b][color=NAVY]([/color][/b]length tl[b][color=NAVY])[/color][/b] 1[b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]setq tmp [b][color=NAVY]([/color][/b]cons [b][color=MAROON]([/color][/b]cons [b][color=GREEN]([/color][/b]car tl[b][color=GREEN])[/color][/b] i[b][color=MAROON])[/color][/b] tmp[b][color=NAVY])[/color][/b] tl [b][color=NAVY]([/color][/b]cdr tl[b][color=NAVY])[/color][/b] i [b][color=NAVY]([/color][/b]1+ i[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b] [b][color=BLACK]([/color][/b]repeat 5 [b][color=FUCHSIA]([/color][/b]setq mi [b][color=NAVY]([/color][/b]apply 'max l[b][color=NAVY])[/color][/b] ma [b][color=NAVY]([/color][/b]assoc mi tmp[b][color=NAVY])[/color][/b] rl [b][color=NAVY]([/color][/b]cons [b][color=MAROON]([/color][/b]cons [b][color=GREEN]([/color][/b]cdr ma[b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]car ma[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b] rl[b][color=NAVY])[/color][/b] l [b][color=NAVY]([/color][/b]datom mi l[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b] [b][color=BLACK]([/color][/b]setq rl [b][color=FUCHSIA]([/color][/b]reverse rl[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b] [b][color=BLACK]([/color][/b]prin1 tmp[b][color=BLACK])[/color][/b] [b][color=BLACK]([/color][/b]princ[color=#2f4f4f]"\n"[/color][b][color=BLACK])[/color][/b] [b][color=BLACK]([/color][/b]prin1 rl[b][color=BLACK])[/color][/b] HTH -David Quote
Lee Mac Posted August 16, 2010 Posted August 16, 2010 Another: (defun Top5 ( lst / LM:ListOccurrences LM:GetFirstN ) (vl-load-com) ;; © Lee Mac 2010 (defun LM:ListOccurrences ( lst ) ;; © Lee Mac 2010 (if lst (cons (cons (car lst) (- (length lst) (length (vl-remove (car lst) lst))) ) (LM:ListOccurrences (vl-remove (car lst) lst)) ) ) ) (defun LM:GetFirstN ( lst n ) ;; © Lee Mac 2010 (if (and lst (< 0 n)) (cons (car lst) (LM:GetFirstN (cdr lst) (1- n))) ) ) (LM:GetFirstN (vl-sort (LM:ListOccurrences lst) '(lambda ( a b ) (> (cdr a) (cdr b)))) 5 ) ) Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.