MathGroup Archive 2006

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

Search the Archive

Re: A question about pattern-matching

  • To: mathgroup at smc.vnet.net
  • Subject: [mg63757] Re: A question about pattern-matching
  • From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
  • Date: Fri, 13 Jan 2006 04:48:53 -0500 (EST)
  • Organization: The Open University, Milton Keynes, UK
  • References: <djcgcs$6du$1@smc.vnet.net> <200510230946.FAA10826@smc.vnet.net> <dq5417$acm$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

gardyloo wrote:
> Hi,  all.
> 
>    I am trying to extract certain parts of a dataset, while retaining 
> some of the overall structure. I decided to do it using pattern-matching
> and replacements, but have run into some problems.
> 
> First, a small subset of the data:
> 
> testList = {{-90, {{60493, 0.061}, {62493, 0.15881}, {64493.5, 
> 
>             0.559}}}, {-88, {{62493, 0.151}, {64493., 0.61617}, {65993.4, 
> 
>             0.171}, {68993.10, 0.06}}}, {-86, {{62493.75, 0.14}, {64493.55, 
> 
>             0.61440}, {65993., 0.18}, {67993, 0.0}, {68993.100, 0.06448}}}};
> 
> 
> The data consists of lists of the form  { integer, {  ordered pair1,
> ordered pair2, ... } }, and my goal is to extract the second number in
> each of the ordered pairs, while retaining the lists' overall structure.
> So, for example, from testList, I'd want something like
>       { { 0.061, 0.15881, 0.559}, {0.151, 0.61617, 0.171, 0.06}, {0.14,
> 0.61440, 0.18,  0.0, 0.06448}}
> returned.
> 
> I've tried several patterns, with variously named bits, and only some of
> them make sense to me (and none of them, yet, return what I really
> want). Can someone explain them to me?
> 
> I'd expect this one to return the list of lists of ordered pairs. It
> returns the full testList:
> 
> testList /. {{(z_)?NumberQ, x:{{_Real, _Real}...}} -> x}
> 
> 
> On the other hand, this one returns only the lists of ordered pairs:
> 
> testList /. {{(z_)?NumberQ, x:{{_, _}...}} -> x}
> 
> I thought that one was free to "type" the parts of the pattern to
> return. I also thought that naming the parts rather freely was allowed.
> The first three of the following return what I would expect, but the
> last one, in naming the first of the ordered pairs' elements, returns
> the testList apparently unchanged:
> 
> In[54]:=
> 
> testList /. {{z_, {x:{_, _}...}} -> z}
> 
> testList /. {{z_, {x:{_, _}...}} -> x}
> 
> testList /. {{z_, x:{{_, _}...}} -> x}
> 
> testList /. {{z_, {x:{a_, _}...}} -> x}
> 
> Out[54]=
> 
> {-90, -88, -86}
> 
> Out[55]=
> 
> {{60493, 0.061}, {62493, 0.15881}, {64493.5, 0.559}, {62493, 0.151}, {64493., 0.61617}, 
> 
>   {65993.4, 0.171}, {68993.1, 0.06}, {62493.75, 0.14}, {64493.55, 0.6144}, {65993., 0.18}, 
> 
>   {67993, 0.}, {68993.1, 0.06448}}
> 
> Out[56]=
> 
> {{{60493, 0.061}, {62493, 0.15881}, {64493.5, 0.559}}, {{62493, 0.151}, {64493., 0.61617}, 
> 
>    {65993.4, 0.171}, {68993.1, 0.06}}, {{62493.75, 0.14}, {64493.55, 0.6144}, {65993., 0.18}, 
> 
>    {67993, 0.}, {68993.1, 0.06448}}}
> 
> Out[57]=
> 
> {{-90, {{60493, 0.061}, {62493, 0.15881}, {64493.5, 0.559}}}, 
> 
>   {-88, {{62493, 0.151}, {64493., 0.61617}, {65993.4, 0.171}, {68993.1, 0.06}}}, 
> 
>   {-86, {{62493.75, 0.14}, {64493.55, 0.6144}, {65993., 0.18}, {67993, 0.}, 
> 
>     {68993.1, 0.06448}}}}
> 
> 
>     Although a solution would help me a lot, I really would like to know
> what I'm missing in applying these replacement rules.
> 
>                 Thanks!
>                         Curtis O.
> 
Hi Curtis,

One of the possible solution is stated in In[2]. Note that I have 
replaced the rule (symbol "->") by a delayed rule (symbol ":>", 
http://documents.wolfram.com/mathematica/functions/RuleDelayed). For a 
full explanation, please check section "2.5.8 Immediate and Delayed 
Definitions" of _The Mathematica Book_, especially the end of the 
section (http://documents.wolfram.com/mathematica/book/section-2.5.8).

In[1]:=
testList = {{-90, {{60493, 0.061}, {62493, 0.15881}, {64493.5, 0.559}}},
     {-88, {{62493, 0.151}, {64493., 0.61617}, {65993.4, 0.171}, 
{68993.1, 0.06}}},
     {-86, {{62493.75, 0.14}, {64493.55, 0.6144}, {65993., 0.18}, 
{67993, 0.}, {68993.1, 0.06448}}}};

In[2]:=
testList /. {{(z_)?NumberQ, x:{{_?NumberQ, _?NumberQ}..}} :> x[[All,2]]}

Out[2]=
{{0.061, 0.15881, 0.559}, {0.151, 0.61617, 0.171, 0.06}, {0.14, 0.6144, 
0.18, 0., 0.06448}}

Keep in mind that a number expressed as an exact value has a head that 
is different from an approximate value. Compare

In[3]:=
Head[60493]

Out[3]=
Integer

In[4]:=
Head[60493.]

Out[4]=
Real

Best regards,
/J.M.


  • Prev by Date: Re: problem with numerical values in Solve/NSolve
  • Next by Date: Re: A question about pattern-matching
  • Previous by thread: Re: A question about pattern-matching
  • Next by thread: Re: A question about pattern-matching