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]