Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Basic Mathematica pattern matching

  1. May 16, 2012 #1
    So I want to be able to count the number of neighbour pairs of opposite sign in a list of 1's and -1's (eg. 1 for {1,1,1,-1,-1} and 3 for {1,-1,1,-1,-1}), but I can't work out the pattern matching syntax in Mathematica even after reading the documentation. I was thinking to use the Count function. Anybody able to help, please?
  2. jcsd
  3. May 16, 2012 #2
    Like so many things in Mathematica, I don't know how you would ever stumble onto this on your own.

    This will tell you the positions where the sign flip happens.

    In[1]:= ReplaceList[{1,1,1,-1,-1}, {pre___, 1,-1,___}|{pre___,-1,1,___} :>Length[{pre}]+1]

    Out[1]= {3}

    In[2]:= ReplaceList[{1,-1,1,-1,-1}, {pre___,1,-1,___}|{pre___,-1,1,___} :>Length[{pre}]+1]

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

    This trick courtesy http://mathematica.stackexchange.com/questions/941/finding-a-subsequence-in-a-list among other places

    And if you wrap a Length[] around those it will tell you how many sign flips.

    In[3]:= Length[ReplaceList[{1,-1,1,-1,-1}, {pre___,1,-1,___}|{pre___,-1,1,___} :>Length[{pre}]+1]]

    Out[3]= 3

    When would you think that the way to find how many of something you have is to begin by destroying your data?
    MatchQ doesn't work, Position doesn't work, Count doesn't work, not as far as I've ever been able to find.
    Last edited: May 16, 2012
  4. May 16, 2012 #3
    How unintuitive! Thanks for that Bill, I wouldn't have figured it out on my own.
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook