Re: Pattern problem: How to count from a long list of numbers
- To: mathgroup at smc.vnet.net
- Subject: [mg87427] Re: [mg87393] Pattern problem: How to count from a long list of numbers
- From: Carl Woll <carlw at wolfram.com>
- Date: Thu, 10 Apr 2008 02:13:42 -0400 (EDT)
- References: <200804090956.FAA25006@smc.vnet.net>
Nasser Abbasi wrote:
>Hello;
>
>I think using Pattern is my weakest point in Mathematica.
>
>I have this list, say this: (it is all a list of integers, no real numbers).
>
>x = {1, 3, 3, 3, 2, 3, 3, 1, 3, 3}
>
>And I want to count how many say a 3 followed immediately by 3. So in the
>above list, there will be 4 such occurrences. And if I want to count how
>many 1 followed by a 3, there will be 2 such cases, etc...
>
>I tried Count[] but I do not know how to set the pattern for "3 followed by
>a comma followed by 3" or just "3 followed immediately by 3".
>
>I tried few things, such as the following
>
>In[68]:= Count[x, {3, 3}_]
>Out[68]= 0
>
>Also tried Cases, but again, I am not to good with Patterns, so not sure how
>to set this up at this moment.
>
>Any ideas will be appreciated.
>
>Nasser
>I really need to sit down and study Patterns in Mathematica really well one
>day :)
>
>
>
If you have long lists and would like this to be very quick, I would do
this by basically finding out the locations of the first and second
elements, and seeing where the two line up. Here is a function that will
do this:
pairCount[data_, p1_, p2_] := Total @ BitAnd[
Clip[Clip[Most[data], {p1, p1}, {p1 - 2, p1 - 2}], {p1 - 1, p1 - 1},
{0, 1}],
Clip[Clip[Rest[data], {p2, p2}, {p2 - 2, p2 - 2}], {p2 - 1, p2 - 1},
{0, 1}]
]
A couple examples:
In[146]:= pairCount[{1, 3, 3, 3, 2, 3, 3, 1, 3, 3}, 3, 3]
Out[146]= 4
In[147]:= pairCount[{1, 3, 3, 3, 2, 3, 3, 1, 3, 3}, 1, 3]
Out[147]= 2
Carl Woll
Wolfram Research
- References:
- Pattern problem: How to count from a long list of numbers all occurrences of 2 numbers next to each others?
- From: "Nasser Abbasi" <nma@12000.org>
- Pattern problem: How to count from a long list of numbers all occurrences of 2 numbers next to each others?