Re: harder parts of list
- To: mathgroup at smc.vnet.net
- Subject: [mg15664] Re: harder parts of list
- From: "Nicolas B.E. Sawyer" <nbes at eee.nott.ac.uk>
- Date: Sat, 30 Jan 1999 04:28:57 -0500 (EST)
- Organization: University of Nottingham
- References: <786uft$29u@smc.vnet.net> <78pavn$cti@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
This uses select: In[18]:= lst={{4,2,3,1},{3,1,5},{2,4,3}} Out[18]= {{4, 2, 3, 1}, {3, 1, 5}, {2, 4, 3}} In[19]:= Map[(first=#[[1]];Select[#,#<first&])&,lst] Out[19]= {{2, 3, 1}, {1}, {}} Hartmut Wolf wrote: > > Dear Arnold > > Arnold Knopfmacher schrieb: > > > > This seems to be a harder list parts problem. Given a list like > > > > lst={{4,2,3,1},{3,1,5},{2,4,3}} > > > > I wish to select the elements in each sublist that are smaller than the > > first entry in that sublist. > > So for the above lst the output should be {{2,3,1},{1},{}}. How can I > > do this with Select or Cases? > > > > Using pattern matching this works > > > > rule1={a_,b___,c_,d___}:>{a,b,d} /;c>a > > > > (# //. rule1)& /@ lst > > > > {{4,2,3,1},{3,1},{2}} > > > > Rest /@ % > > > > {{2,3,1},{1},{}} > > > > Thanks > > Arnold Knopfmacher > > Wiws University > > South Africa > > You do have a solution with replacement rules, that works. In fact you > solved for "smaller or equal", as you see with lst2: > > lst2= {{4,2,3,4},{3,1,5},{1,1,1},{0}} > > (# //. rule1)& /@ lst2 > > then gives: > > {{4,2,3,4},{3,1},{1,1,1},{0}} > > and then > > Rest /@ % > > results to: > > {{2,3,4},{1},{1,1},{}} > > If you want only to keep the "smaller" elements then just throw away > those greater or equal: > > rule2={a_,b___,c_,d___}:>{a,b,d} /;c>=a > > which gives > > (# //. rule2)& /@ lst2 > > {{4,2,3},{3,1},{1},{0}} > > Rest /@ % > > {{2,3},{1},{},{}} > > You can have a solution with Select, which differs a little bit when > selecting for elements "smaller or equal" (1) or "smaller" (2). > > For (1) try: > > Function[x,Rest[Select[x, (# <= x[[1]]) &]]] /@ lst2 > > {{2,3,4},{1},{1,1},{}} > > for (2) Rest could result to an error Rest::norest, but you don't need > Rest then (because you first sublist elements won't be kept), so > > Function[x,Select[x, (# < x[[1]]) &]] /@ lst2 > > {{2,3},{1},{},{}} > > This wasn't the case with your replacement rule, since you explicitly > demanded and needed(!) to keep the first element. > > Perhaps your real problem was to nest two pure functions. Use Function > to give unambiguous names to the arguments. > > With Cases you don't have that problem, since the other variable is a > pattern you have to give a name to anyways: > > Rest[Cases[#, y_ /; y <= #[[1]] ]]& /@ lst2 > > {{2,3,4},{1},{1,1},{}} > > for (1) and for (2) respectively: > > Cases[#, y_ /; y < #[[1]] ]& /@ lst2 > > {{2,3},{1},{},{}} > > Back to your own solution, of course you can make a one-liner: > > Rest[# //. rule1]& /@ lst2 > > {{2,3,4},{1},{1,1},{}} > > and > > Rest[# //. rule2]& /@ lst2 > > {{2,3},{1},{},{}} > > Even more elegantly define > > selectAccordingTo = Function[x, Rest[x //. #]]& > > then > > selectAccordingTo[rule1] /@ lst2 > > {{2,3,4},{1},{1,1},{}} > > and > > selectAccordingTo[rule2] /@ lst2 > > {{2,3},{1},{},{}} > > As often there are a hundred of possibilities, and certainly some are > more elegant, performant, handy, or ... what you like. > > Hartmut -- Nicolas B.E. Sawyer Department of Electrical and Electronic Engineering, University of Nottingham, University Park, Nottingham, NG7 2RD. Tel: +44 115 9515151 ext 12028 Fax: +44 115 9515616 E-mail: nbes at eee.nottingham.ac.uk