MathGroup Archive 2008

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

Search the Archive

Re: finding positions of elements in a list

  • To: mathgroup at smc.vnet.net
  • Subject: [mg86860] Re: finding positions of elements in a list
  • From: Szabolcs Horvát <szhorvat at gmail.com>
  • Date: Mon, 24 Mar 2008 01:43:19 -0500 (EST)
  • Organization: University of Bergen
  • References: <fs4rs5$p9h$1@smc.vnet.net>

Dana DeLouis wrote:
>> I also tried Position but it wasn't clear to me if a pattern can be used
> for this.
> 
> Hi.  You have answers, but I see you were stuck on using "Position."
> Here's one way if you ever need to use it:
> 
> 
> pts = {{20, 109}, {21, 50}, {20, 110}, {22, 60}};
> 
> Position[pts, {___, n_} /; n > 80]
> 
> {{1}, {3}}
> 
> Extract[pts, %]
> 
> {{20, 109}, {20, 110}}

There is one important caveat though, which is not present with Cases or 
Select.  Position[] searches the expression at all levels.  Suppose that 
  we are trying to find those pairs whose second element is not 1.

In[1]:= pts = RandomInteger[2, {10, 2}]
Out[1]= {{1, 0}, {0, 0}, {2, 0}, {0, 2}, {2, 0}, {1, 2}, {2, 2},
          {2, 1}, {1, 1}, {0, 1}}

In[2]:= Position[pts, {___, n_} /; n =!= 1]
Out[2]= {{1}, {2}, {3}, {4}, {5}, {6}, {7}, {}}

Note the {} at the end of the list.  It indicates that the complete 
expression matches too.

There are many little details that can hide this behaviour for most 
input lists (e.g. using a different pattern or != instead of =!=), but 
it is good to mention that it is possible to only match against the 
elements of the list by using a level specification:

Position[pts, {___, n_}, {1}]

This might seem like a trivial detail, but I have been bitten by this 
type of mistake more than once.


  • Prev by Date: Re: Funny behaviour of ClipboardNotebook[] (Q: How to copy programmatically?)
  • Next by Date: Re: Re: Re: Re: smallest
  • Previous by thread: Re: finding positions of elements in a list
  • Next by thread: Re: finding positions of elements in a list