Re: SameTest in Union
- To: mathgroup at smc.vnet.net
- Subject: [mg61117] Re: SameTest in Union
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Tue, 11 Oct 2005 03:20:09 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <did38g$qht$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Jack Goldberg wrote: > Hi Folks, > > I know there is a simple answer to this question but the help index > idoes not help! > > I have a list, something like this: > > lst = {1.1101, 1.11095, 1.11076, 1.09, 2.3523, 2.352. 2.35211} > > I want to remove from the list those entries which are near each > other but not identical, leaving only one representative for each of > these numbers. One approach is to use Union with the option > SameTest->???. Here the same test might be that the difference > between entries is less than, say 10^(-2). But I can't seem to get > SameTest to work. So, what I want is > > Union[ lst, SameTest- > ?] > > so that the union returns > > {1.1101, 2.35211} > > Here, I chose 2 representatives. Any other choice is OK; say, > > {1.11095, 2.352} > > is also satisfactory. > > There may be other ways to do this, but I thought of Union first. > Perhaps, Cases or Select might be better. Any help is appreciated. > > Jack > Hi Jack, One way of doing this is to use a pure function for *SameTest* that compares absolute differences between each pair of values and returns *True* whenever differences are less than, say, 10^(-2). Also, note that I have corrected the syntax of your list for the last two numbers were not separated by a comma but were concatenated by a dot. In[1]:= lst = {1.1101, 1.11095, 1.11076, 1.09, 2.3523, 2.352, 2.35211} Out[1]= {1.1101, 1.11095, 1.11076, 1.09, 2.3523, 2.352, 2.35211} In[2]:= Union[lst, SameTest -> (Abs[#2 - #1] < 10^(-2) & )] Out[2]= {1.09, 1.1101, 2.352} Best regards, /J.M.