Best strategy for finding a pattern in a sequence of integers

Anton Vredegoor anton.vredegoor at gmail.com
Fri Nov 21 18:38:39 EST 2008


On Fri, 21 Nov 2008 18:10:02 +0100
Gerard flanagan <grflanagan at gmail.com> wrote:

> data = '''
> 1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 9 3 3 0 3 3 0 3 3 0 3 3 0 10 6 6
> 1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 9 3 3 0 3 3 0 3 3 0 3 3 0 10 6 6
> 1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 9 3 3 0 3 3 0 3 3 0 3 3 0 10 6 6
> 1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 9 3 3 0 3 3 0 3 3 0 3 3 0 10 6 6
> 1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1'''
> 
> data = [int(x) for x in data.split()]
> 
> from itertools import groupby

But groupby needs sorted data?

Suppose the rules do not conflict or overlap and between them divide
all the values, then maybe this would work:

class StateMachine:
    
    def __init__(self,*rules):
        self.rules = rules
        self.state = len(rules) #deliberately unreachable
        self.first = True
    
    def change(self,x):
        #check and/or change state 
        for i,rule in enumerate(self.rules):
            if rule(x):
                if i == self.state: #no state change
                    return False 
                else: #maybe state change
                    self.state = i 
                    if self.first: #set initial state, no change
                        self.first = False
                        return False
                    else:
                        return True #state is changed
        raise ValueError
    
def test():

    data = '''
    1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 9 3 3 0 3 3 0 3 3 0 3 3 0 10 6 6
    1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 9 3 3 0 3 3 0 3 3 0 3 3 0 10
6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 9 3 3 0 3 3 0 3 3 0 3 3 0 10
6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 9 3 3 0 3 3 0 3 3 0 3 3 0 10
6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1 6 6 1'''

    data = map(int, data.split())

    def rule1(x):
        return x in set((0, 3, 9))
    def rule2(x):
        return x in set((6, 1, 10))
        
    state = StateMachine(rule1,rule2)
    L = []
    res = []
    for x in data:
        if state.change(x):
            res.append(list(L))
            L =[]
        L.append(x)
    res.append(list(L))
    print res

if __name__=='__main__':
        test()






More information about the Python-list mailing list