Re: A question about pattern-matching
- To: mathgroup at smc.vnet.net
- Subject: [mg63738] Re: A question about pattern-matching
- From: albert <awnl at arcor.de>
- Date: Fri, 13 Jan 2006 04:48:14 -0500 (EST)
- 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
Hi,
> 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}
>
the first pattern does not match because some of the numbers in your orderd
pairs are Integers, _not_ Reals. The following works:
testList /. {{z_?NumberQ, x : {{_?NumericQ, _Real} ...}} -> x}
> I thought that one was free to "type" the parts of the pattern to
> return.
you can, but you need to be more carefull...
> 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}
>
again, everything works as designed, I think. The problem is not with the
naming per se. Introducing the a-naming, the pattern will only match, when
the first entry in all orderd pairs is the same, maybe evaluating the
following two examples will clarify this:
{{1, 2}, {1, 3}, {1, 4}} /. {x : {a_, _} ...} -> x
{{2, 2}, {1, 3}, {1, 4}} /. {x : {a_, _} ...} -> x
in fact at first I was surprised that
testList /. {{z_, {x:{_, _}...}} -> x}
actually works, but this is because of precedence of : and ... is different
from what I was naivly expecting, compare:
testList /. {{z_, {x:({_, _}...)}} -> x}
testList /. {{z_, {(x:{_, _})...}} -> x}
Anyway, the following should do what you want:
testList /. {{z_?NumberQ, x : {{_?NumericQ, _?NumericQ} ...}} :> Last /@ x}
depending on how well determined the structure of your data is, it might be
a good idea to restrict the replacing to a certain level of your data
(could well be faster for large datasets, too), e.g.:
Replace[
testList,
{{z_?NumberQ, x : {{_?NumericQ, _?NumericQ} ...}} :> Last /@ x},
{1}
]
hth
albert