Re: Pattern problem: How to count from a long list of numbers all
- To: mathgroup at smc.vnet.net
- Subject: [mg87428] Re: Pattern problem: How to count from a long list of numbers all
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Thu, 10 Apr 2008 02:13:53 -0400 (EDT)
- Organization: University of Bergen
- References: <fti404$ok1$1@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...
This is something that patterns are paticularly *not* suited for.
Patterns don't work for these kinds of things because a pattern will
always be tested against a single expression at a time. Of course there
is __, ___, and .., but these are used as part of a larger pattern,
which is tested against single expressions only. (Actualy this is not
strictly true when matching with Flat, OneIdentity or Orderless
functions ... I don't understand completely how those work ...) For
example, it is not possible to get the __ pattern to match more than one
expression when used on its own (and not as part of a larger pattern at
a deeper level).
However, there does exist a way to accomplish this with patterns. The
trick is to count in how many different ways can the {___, 3, 3, ___}
pattern match the entire list:
In[1]:= x = {1, 3, 3, 3, 2, 3, 3, 1, 3, 3}
Out[1]= {1, 3, 3, 3, 2, 3, 3, 1, 3, 3}
In[2]:= ReplaceList[x, {___, 3, 3, ___} -> Null]
Out[2]= {Null, Null, Null, Null}
In[3]:= Length[%]
Out[3]= 4
>
> 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
{3,3}_ means {3,3} * _
Note that even in a pattern written as x_, it is _ that matches
something (it can match any single expression), and not x. x is just a
name used to refer to the expression that matches _
>
> 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 :)
Here are two alternative ways (without patterns):
Count[Partition[x, 2, 1], {3, 3}]
Count[Table[x[[{i, i + 1}]] === {3, 3}, {i, 1, Length[x] - 1}], True]