MathGroup Archive 2009

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: DeleteCases

  • To: mathgroup at smc.vnet.net
  • Subject: [mg98179] Re: DeleteCases
  • From: lshifr at gmail.com
  • Date: Wed, 1 Apr 2009 05:58:18 -0500 (EST)
  • References: <gqsn69$3qp$1@smc.vnet.net>

On Mar 31, 2:19 am, Filippo Miatto <sottosupr... at gmail.com> wrote:
> Dear all,
> Given this example list:
>
> {{0, 0, 1, 1}, {0, 0, 2, 2}, {0, 0, 3, 3}, {1, 1, 0, 0}, {1, 1, 2, 2}, =
 
> {1, 1, 3, 3}, {2, 2, 0, 0}, {2, 2, 1, 1}, {2, 2, 3, 3}, {3, 3, 0, 0},  
> {3, 3, 1, 1}, {3, 3, 2, 2}}
>
> I need the elements {a,a,b,b} and {b,b,a,a} to be the same, i.e. i  
> want to delete one of the two occurrences from the list. (or all but  
> one if the condition is more complicated, say {a,b,c,d} and {b,a,c,d}  
> or {a,b,c,d} and {a,b,d,c})
> How can i do that? Can i use DeleteCases? if so, what conditional  
> should I use to compare different elements in the list?
> I tried without success for all the night.. (it's 6.15AM now!)
> Thank you,
>
> Filippo

Hi Filippo,

DeleteCases is probably a wrong choice here, since you don't know
in advance which elements you want to delete.

In[1] =
test = {{0, 0, 1, 1}, {0, 0, 2, 2}, {0, 0, 3, 3}, {1, 1, 0, 0}, {1, 1,
    2, 2}, {1, 1, 3, 3}, {2, 2, 0, 0}, {2, 2, 1, 1}, {2, 2, 3, 3}, {3,
    3, 0, 0}, {3, 3, 1, 1}, {3, 3, 2, 2}};

If you just need to keep a single representative, but do not
care about the order (do you get the first, second or whatever of
the equivalents), then use Sort to bring them to "normal form", and
then Union will remove the duplicates:

In[2] = Union[Sort /@ test]

Out[2] = {{0, 0, 1, 1}, {0, 0, 2, 2}, {0, 0, 3, 3}, {1, 1, 2, 2}, {1,
1, 3,
  3}, {2, 2, 3, 3}}

If you want to keep the very first of the equivalents encountered
while traversing the list, it's a bit trickier. Here is the
implementation
which should be efficient enough for even large lists:

In[3] =
unsortedRepresentatives[x_List] :=
 With[{sorted = Sort /@ x},
  Extract[x,
   Sort[Union[sorted] /. Dispatch[MapIndexed[Rule, sorted]]]]];

It is based on modified <unsortedUnion> operation that I discussed
in my book (section on MapIndexed), where this code is explained.

In[4] = unsortedRepresentatives[test]


Out[4] = {{0, 0, 1, 1}, {0, 0, 2, 2}, {0, 0, 3, 3}, {1, 1, 2, 2}, {1,
1, 3,
  3}, {2, 2, 3, 3}}

In this case, the result is the same, but you can easily convince
yourself that in general the result will be different (take a random
permutation of your list for instance).

Regards,
Leonid



  • Prev by Date: Re: Using manipulate in two cells in one note book crashes my computer.
  • Next by Date: Update to Hinton Button/palette tutorial for Mathematica 7?
  • Previous by thread: Re: DeleteCases
  • Next by thread: Re: DeleteCases