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: [mg63753] Re: [mg63728] A question about pattern-matching
  • From: "Igor C. Antonio" <igora at wolf-ram.com>
  • Date: Fri, 13 Jan 2006 04:48:40 -0500 (EST)
  • References: <djcgcs$6du$1@smc.vnet.net> <200510230946.FAA10826@smc.vnet.net> <200601120822.DAA10486@smc.vnet.net>
  • Reply-to: igora at wolf-ram.com
  • 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.

This does what you want:

In[2]:=
testList /.{z_?NumberQ, x_}:> (Part[#,2]&/@x)

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}}

(Notice the RuleDelayed)




> 
> 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}
> 

Returning the original input means that no pattern matched.

> 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:
> 
> 
> testList /. {{z_, {x:{a_, _}...}} -> x}
> 

Again, it simply didn't match any patterns you provided, so returns the original 
input.  With the pattern above, you're saying that you want every first element 
of the ordered pair to be the same (within the scope of each element of 
testList). You're saying your input is like this:

   {-90, {a1, <something>}, {a1, <something}}, {a1, <something>}, etc...}

Example:

In[5]:=
testList = {{-90, {{111, 0.061}, {111, 0.15881}, {111, 0.559}}},
      {-88, {{111, 0.151}, {112, 0.61617}, {113, 0.171}, {114, 0.06}}}};


In[6]:=
testList /. {{z_, {x:{a_, _}...}} -> x}

Out[6]=
{{111, 0.061}, {111, 0.15881}, {111,
   0.559}, {-88, {{111, 0.151}, {112, 0.61617}, {113, 0.171}, {114, 0.06}}}}

Notice that the second element of testList didn't match because the first 
element of each ordered pair is different.

--
Igor C. Antonio
Wolfram Research, Inc.
http://www.wolfram.com

To email me personally, remove the dash.


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