Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2006
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2006

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

Search the Archive

Re: finding the position of a pattern in list

  • To: mathgroup at smc.vnet.net
  • Subject: [mg64616] Re: finding the position of a pattern in list
  • From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
  • Date: Fri, 24 Feb 2006 00:18:11 -0500 (EST)
  • Organization: The Open University, Milton Keynes, UK
  • References: <dtjjcv$de7$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Gang Ma wrote:
> Hi,
> I am working on a program to do the following: My data is a list of 0  
> and 1. For example, {0,0,1,1,1,0,0,1,1,1,0}. I want to find the  
> positions of all the pattern of {0,1}.  In my previous example, the  
> first {0,1} is at 2 and and the second {0,1} appears at 7. I can  
> write a loop to do this, but I have several thousands such lists,   
> the computation will be time consuming using loop.
> 
> My question is whether it is possible to use the pattern match to do  
> this quickly.  If not for the list, do I need to convert the list to  
> string then use some pattern match for string?  Thank you very much.
> 
> regards,
> 
> Gang Ma
> 
>   
> 
Hi,

You could try the following one-liner see {In[2]):

In[1]:=
data={0,0,1,1,1,0,0,1,1,1,0};

In[2]:=
Flatten[Position[Partition[data,2,1],{0,1}]]

Out[2]=
{2,7}

How does it work?

In[3]:=
data={0,0,1,1,1,0,0,1,1,1,0}

Out[3]=
{0,0,1,1,1,0,0,1,1,1,0}

In[4]:=
Partition[data,2]

Out[4]=
{{0,0},{1,1},{1,0},{0,1},{1,1}}

Not what we are looking for: we want an offset of only one position.

In[5]:=
Partition[data,2,1]

Out[5]=
{{0,0},{0,1},{1,1},{1,1},{1,0},{0,0},{0,1},{1,1},{1,1},{1,0}}

In[6]:=
Position[Partition[data,2,1],{0,1}]

Out[6]=
{{2},{7}}

In[7]:=
Flatten[Position[Partition[data,2,1],{0,1}]]

Out[7]=
{2,7}

Performances seem quite good (Pentium IV, 512 MB, WinXP, Mathematica 5.2)

In[8]:=
data=Table[Random[Integer],{10^6}];
Timing[Position[Partition[data,2,1],{0,1}];][[1]]

Out[9]=
1.204 Second

Best regards,
/J.M.


  • Prev by Date: Re: Re: How if I want to assume that -------
  • Next by Date: Re: finding the position of a pattern in list
  • Previous by thread: Re: Re: finding the position of a pattern in list
  • Next by thread: Re: finding the position of a pattern in list