Re: Symbol Frequency

Liste des GroupesRevenir à cl lisp 
Sujet : Re: Symbol Frequency
De : Nobody447095 (at) *nospam* here-nor-there.org (B. Pym)
Groupes : comp.lang.lisp comp.lang.scheme
Date : 15. Sep 2024, 07:23:30
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vc5r0d$20jhc$1@dont-email.me>
User-Agent : XanaNews/1.18.1.6
John Gilson wrote:

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

Gauche Scheme:

(define (occurrences tree)
  (rlet1 alist '()
    (let go ((x tree))
      (cond
        ((null? x))
        ((pair? x) (go (car x)) (go (cdr x)))
        (#t (ainc! alist x))))))

(occurrences '(a (a (a b c) b c) b . c))
  ===>
((c . 3) (b . 3) (a . 3))

Given:

(define-syntax ainc!
  (syntax-rules ()
    [(_ alist key val func default)
     (let ((pair (assoc key alist)))
       (if pair
         (set-cdr! pair (func val (cdr pair)))
         (set! alist (cons (cons key (func val default)) alist))))]
    [(_ alist key val func)
     (ainc! alist key val func 0)]
    [(_ alist key val)
     (ainc! alist key val +)]
    [(_ alist key)
     (ainc! alist key 1)]))

Date Sujet#  Auteur
15 Sep07:23 o Re: Symbol Frequency1B. Pym

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal