Re: Need a functional process for this.
- To: mathgroup at smc.vnet.net
- Subject: [mg55629] Re: Need a functional process for this.
- From: Curt Fischer <tentrillion at gmail.NOSPAM.com>
- Date: Thu, 31 Mar 2005 01:25:23 -0500 (EST)
- References: <d2dpdm$lsd$1@smc.vnet.net> <d2dv3b$8u$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Curt Fischer wrote: > Steve Gray wrote: > >> I have two lists, aa and bb. aa has the general form {2,5,7,9,11,...} >>(or{{2},{5},{7},{9},{11},...}), and bb has the general form {{6,4},{9,2},{5,6},{3,8},.... If either >>the first or second element in any sublist (pair of integers) of bb matches any element in aa, I >>want to delete that sublist from bb. In the above example, neither member of {6,4} or {3,8} belongs >>to aa, while at least one element of {9,2} and {5,6} belongs to aa, so bb becomes {{6,4},{3,8}}. If >>aa had only one element, for example 7, I could do bb=Delete[bb,Position[bb,{x_,7}|{7,y_}]], but I >>don't know how to do it for several values instead of just "7" without using a procedural loop. >> What is a good functional way to do this? >> Thank you for any tips. >> >>Steve Gray > > I have a feeling there is a better solution that involves DeleteCases[], > but I couldn't come up with anything off the bat. I figured out a way to use DeleteCases that in my opinion is more elegant than my previous answer and should also be faster on large-scale problems (I think). In[1]:= aa={2,5,7,9,11} Out[1]= {2,5,7,9,11} In[2]:= bb={{6,4},{9,2},{5,6},{3,8}} Out[2]= {{6,4},{9,2},{5,6},{3,8}} In[3]:= DeleteCases[bb,Alternatives@@({x_,#}|{#,y_}&/@aa)] Out[3]= {{6,4},{3,8}} The trick in this case is to realize that p|q has the FullForm of Alternatives[p,q]. This fact gives us a handle on using | in functional programming-type ways. It's instructive to see the second argument of DeleteCases[] evaluated on its own. In[4]:= Alternatives@@({x_,#}|{#,y_}&/@aa) Out[4]= ({x_,2}|{2,y_})|({x_,5}|{5,y_})|({x_,7}|{7,y_})|({x_,9}|{9,y_})|({x_,11}|{11, y_}) Oh yeah, in case you are not familiar with the shorthand notation, @@ means Apply[] and /@ means Map[]. And the # and & symbols construct a pure function. -- Curt Fischer