Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

10 views
Skip to first unread message

Robert L.

unread,
Apr 1, 2022, 3:42:25 PM4/1/22
to
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))
0 new messages