Re: How to select unique elements in a list?
- To: mathgroup at smc.vnet.net
- Subject: [mg7986] Re: How to select unique elements in a list?
- From: crose at c2.telstra-mm.net.au (Colin Rose)
- Date: Wed, 30 Jul 1997 23:57:37 -0400
- Organization: Theoretical Research Institute
- Sender: owner-wri-mathgroup at wolfram.com
"Carl Woll" <carlw at u.washington.edu> wrote: > First, let me say that Union does not do what I'm looking for! I am > interested in a function which returns the unique elements from a list. > Let's call the function Distinct. Then, I want > > Distinct[{i1,i2,i3,i2}] to return {i1,i3} How about: Z[x_] := Select[ Split[Sort[x]], (Length[#] == 1)&]//Flatten eg: In[] test=Table[ i[Random[Integer,1000]],{1000}]; In[] Z[test]; // Timing Out[] {0.05 Second,Null} PowerMac 8600/200 > my best functional solution so far is, > > RemoveDuplicates[a___,i_,i_,b___]:=RemoveDuplicates[a,b] > Distinct[a_List]:=List@@RemoveDuplicates@@Sort[a] > > However, this solution is very slow. For example, with > > test=Table[i[Random[Integer,1000]],{1000}]; > > it takes approximately 27 seconds to evaluate Distinct[test] on an SGI > system. This is slow when compared to .01 seconds to evaluate Union[test]! It appears that your Distinct fn gives the incorrect answer, since (i) Z[test] == Distinct[test] yields FALSE, and (ii) Z[test] appears to be correct. That is the problem with pattern matching: you have to catch ALL the possible patterns. Hope this helps Cheerio Colin -- Colin Rose tr(I) - Theoretical Research Institute ______________________________________ crose at c2.telstra-mm.net.au http://www.usyd.edu.au/su/tri/