• .Re: Inverting alists -- *NOT* a homework assignment!!

    From Robert L.@21:1/5 to Christopher N. Vogt on Fri Apr 1 19:42:18 2022
    Christopher N. Vogt wrote:

    ;; Hi. I would like to invert an alist of the form ;; ;; ((reference-1 referent-a referent-b...) (reference-2 referent-c ...)...) ;; ;; to
    another alist of the form ;; ;; ((referent-a reference-1) (referent-b reference-1) ;; (referent-c reference-2) ...) ;; ;; I have gotten something to work but it's so stupefyingly *UGLY* that I ;; just know someone out there can demonstrate a more better beautiful ;; elegant
    means of achieving the same result. ;; ;; [ I'm working in emacs-lisp
    with the 'cl' package, so the code below ;; ought to be reasonably close
    to Common Lisp...] ;; ;; ;; Mind you, I am teaching myself lisp and THIS

    ....

    I'd do it something like this:
    (defun invert-alist (alist)
    (loop for list in test
    for reference = (first list)
    appending (loop for referent in (cdr list)
    collect (list referent reference))))

    Gauche Scheme or Racket:

    ;; cut for Racket
    (require srfi/26)

    (define (invert-alist alist)
    (append-map
    (lambda (xs) (map (cut list <> (car xs)) (cdr xs)))
    alist))

    (invert-alist '((a 0 2) (b 3 5 7)))

    ((0 a) (2 a) (3 b) (5 b) (7 b))

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)