RE: Keeping order with Union

• To: mathgroup at smc.vnet.net
• Subject: [mg32611] RE: [mg32590] Keeping order with Union
• From: "David Park" <djmp at earthlink.net>
• Date: Thu, 31 Jan 2002 01:45:42 -0500 (EST)
• Sender: owner-wri-mathgroup at wolfram.com

```Dave,

If your list is composed of integers or exact expressions, then there is the
very efficient and clever routine that Carl Woll put forth a year or so ago
on MathGroup.

RemoveRepeats[x_] :=
Block[{i},
i[n_] := (i[n] = Sequence[]; n);
i /@ x]

list = Array[Random[Integer, {0, 9}] &, 100]
{1,9,0,7,6,4,3,1,7,6,2,3,0,1,7,7,0,1,0,9,1,1,5,4,5,0,7,6,7,9,2,4,8,3,6,2,1,2
,\
0,8,7,7,0,7,6,0,8,1,8,0,7,2,0,2,2,8,8,2,4,9,6,0,2,9,6,3,7,6,8,3,4,0,8,6,9,4,
7,\
3,4,8,5,0,3,6,2,0,6,6,8,0,8,2,9,3,9,6,7,0,0,8}

RemoveRepeats[list]
{1, 9, 0, 7, 6, 4, 3, 2, 5, 8}

Here is an alternative method, much slower, but it can be used on
approximate expressions if you adjust the SameTest to something appropriate
for the specific case.

list2 = Transpose[{Range[Length[list]], list}];
list2 = Union[list2, SameTest ->
(#1[[2]] == #2[[2]] & )];
Last /@ list2

When I ran on a list of 100000 integers, the Woll routine took 0.39 seconds,
and the second routine took 6.42 seconds.

David Park

To: mathgroup at smc.vnet.net
>
> I'd like a function that throws out duplicate entries in a list and keeps
> the
> original list order.  (when it sees 2 equal entries it throws out the one
> that is later in the list).   I'd use Union, but it sometimes changes the
> order of the elements in the list.  What's the tersest way to do this?