William James
1/20/2016 9:35:00 PM
WJ wrote:
> 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))))
MatzLisp (Ruby):
def invert_alist a
a.flat_map{|k,*vs| vs.map{|v| [v,k]}}
end
invert_alist [[:a,0,2],[:b,3,5,7]]
==>[[0, :a], [2, :a], [3, :b], [5, :b], [7, :b]]
--
Use this [sword] for me, if I rule well; if not, against me. --- Trajan
"If a government uses the instruments of power in its hands for the purpose of
leading a people to ruin, then rebellion is not only the right but also the
duty of every individual citizen."