Re: Position[] pattern matching
- To: mathgroup at smc.vnet.net
- Subject: [mg4251] Re: Position[] pattern matching
- From: espen.haslund at fys.uio.no (Espen Haslund)
- Date: Sun, 23 Jun 1996 03:07:53 -0400
- Organization: Universitet i Oslo
- Sender: owner-wri-mathgroup at wolfram.com
In article <4q093q$fiu at dragonfly.wolfram.com>, haraldb at nature.berkeley.edu
says...
>
>I just ran into a strange pattern-matching problem:
>
>I'm reading some infomation from a disk file with
>
>fInfo = ReadList[
> "NDEC:EWW:RODDAT.PRN",
> {Word, Word, Word, Word, Word, Word, Word,
> Number, Number, Number, Number}
>]
>
>Now, I want all records whose 4th word starts with an "L":
>
.........
>
>So, I get the right answer, but only after a bunch of error messages.
>What if I look only at level 1 of the list?
>
>In[30]:=
>Position[
> fInfo,
> x_/;(StringTake[ x[[4]], 1 ] == "L"),
> 1
>]
>Part::partd: Part specification List[[4]]
> is longer than depth of object.
>Out[30]=
>{{5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}, {13}, {14}, {15},
> {16}, {17}, {18}, {19}, {20}, {21}, {22}, {23}, {24}, {25},
> {26}, {27}, {28}, {29}, {30}, {31}, {32}, {45}, {46}, {47},
> {48}, {49}, {50}, {51}, {52}, {53}, {54}, {55}, {56}}
>
>Again, right answer, but still one error message.
>
>I wouldn't mind, as long as I get the right answer, but if I get an
>error message might there not be cases when I don't get the right
>answer?
Hi, Harald
The problem is that Position tries to look at Part 4 of the
Head of the list (named List) which
produces the error message.
To see what goes on you can add a Print[x] to the condition:
In: lis = Take[Permutations[{"one","two","three","four"}],5];
In: Position[lis,
x_ /; (Print[x];StringTake[x[[4]],1]) == "t", {1}]
List
{one, two, three, four}
{one, two, four, three}
{one, three, two, four}
{one, three, four, two}
{one, four, two, three}
Part::partd:
Part specification List[[4]]
is longer than depth of object.
Out: {{2}, {4}, {5}}
Fortunately the problem is easily solved by using the option Heads->False:
In: Position[lis,
x_ /; StringTake[x[[4]],1] == "t", {1},
Heads->False]
Out: {{2}, {4}, {5}}
>
>P.S., a pet peeve: why can I say
>
Select[ fInfo, (#[[4]] == somethingorother )& ]
>but need to say
>
Position[ fInfo, x_/;x[[4]] == somethingorother) ]
>
>Shouldn't these allow the same formulation of the patten-match
>requirements?
This also confuses me. What is the reason for this difference?
-Espen
==== [MESSAGE SEPARATOR] ====