Jump to content

Recommended Posts

Posted

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

Posted

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

Posted

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....?

Posted

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

Posted

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

Posted

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
 )
)

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...