Re: RE: easiest way to sort a list?
- To: mathgroup at smc.vnet.net
- Subject: [mg18384] Re: [mg18323] RE: [mg18308] easiest way to sort a list?
- From: gaylord at ux1.cso.uiuc.edu (richard j. gaylord)
- Date: Wed, 30 Jun 1999 14:13:39 -0400
- Organization: university of illinois
- References: <7l8iv1$n5o$2@dragonfly.wolfram.com>
- Sender: owner-wri-mathgroup at wolfram.com
> > Peter (peterw at cco.caltech.edu) wrote: > > ------------------- > > Suppose you have a list of integers, not all distinct, say > > {1, 5, 3, 5, 10, 10, 1}, > > > > and you want to obtain the list > > > > {1, 5, 3, 10} > > > > which is the set of distinct elements but with the order preserved; i.e., > > the order in which the elements in the second list appear is the same as > > the order in which it first occurs in the first list. What is a simple > > way to do this? Evidently Union[] sorts the elements in canonical order, > > which is not desirable. My current solution is so messy that I suspect > > there must be an easier way. > > > > ------------------------ > > > > Peter, > > > > Robby Villegas posted a slick solution to this problem in this newsgroup. > > See [mg8265] from 23, August 1997. > > ----------------------- > > > > In[1]:= > > RestoreOrder[subset_, list_] := Last /@ Sort[ {Position[list, #, {1}, 1][[1, > > 1]], #}& /@ subset ] ; > > EliminateRepetition[list_List] := RestoreOrder[Union[list], list] here's a more elegant one-liner [one-liners are always more elegant :) ] : In[3]:= dog[lis_] := lis[[Sort[Flatten[Map[Position[lis, #, 1, 1] &, Union[lis]]]]]] In[16]:= pig = Table[Random[Integer, {1, 9}], {500000}]; In[19]:= horse = EliminateRepetition[pig] // Timing Out[19]= {10.3667 Second, {9, 4, 3, 1, 2, 6, 5, 8, 7}} In[21]:= cow = dog[pig] // Timing Out[21]= {10.25 Second, {9, 4, 3, 1, 2, 6, 5, 8, 7}} so for a list of 500,000 integers (of which only 9 are unique) the dog function is clearly MUCH faster than robby's solution :) -- "I would say life is pretty pointless, wouldn't you, without the movies?" Vincent Gallo as Johnny Tempi in The Funeral (1996)