Re: List complement operator
- To: mathgroup at smc.vnet.net
- Subject: [mg85025] Re: [mg84950] List complement operator
- From: Sseziwa Mukasa <mukasa at jeol.com>
- Date: Thu, 24 Jan 2008 04:45:39 -0500 (EST)
- References: <200801210906.EAA09417@smc.vnet.net>
On Jan 21, 2008, at 4:06 AM, zac wrote:
> Dear group,
>
> I'm loooking for an elegant and efficient way to subtract a list (not
> a set) from an other one.
>
> a = {1, 1, 1, 2, 3, 3, 4, 5, 5, 5, 2, 6, 7, 7};
> b = {1, 2, 2, 3, 4, 7, 8};
>
> Complement[a,b] returns {5, 6}, as expected. However I would like to
> treat each entry as a discrete element, therefore my target result is:
> {1, 1, 3, 5, 5, 5, 6, 7}. Union can not be used, although Sort is
> allowed (ie. whether the result is sorted or not is of no concern).
> Any idea?
It seems you'd like to remove one copy of each element from A that is
in B, remove that element from B and repeat the process which looks
like a Fold operation to me. First define a function that searches
for an element in a list and remove one copy if found.
removeElement[a_,b_]:=Module[{pos=Position[a,b]},If[pos!={},pos=First
[Flatten[pos]];Join[a[[;;pos-1]],a[[pos+1;;]]],a]]
then use it in fold to remove a list of elements:
Fold[removeElement[#1,#2]&,a,b]
Regards,
Ssezi
- References:
- List complement operator
- From: zac <replicatorzed@gmail.com>
- List complement operator