Esempio n. 1
0
 def test_delete(self):
     tst = TST()
     tst.put("a", "A")
     self.assertEquals(1, len(tst))
     self.assertEquals("A", tst.get("a"))
     tst.delete("b")
     self.assertEquals(1, len(tst))
     tst.delete("a")
     self.assertEquals(1, len(tst))
     self.assertIsNone(tst.get("a"))
Esempio n. 2
0
 def test_put_get(self):
     tst = TST()
     self.assertEquals(0, len(tst))
     self.assertIsNone(tst.get("a"))
     tst.put("a", "a")
     self.assertEquals(1, len(tst))
     self.assertEquals("a", tst.get("a"))
     tst.put("b", "b")
     self.assertEquals(2, len(tst))
     self.assertEquals("a", tst.get("a"))
     self.assertEquals("b", tst.get("b"))
     tst.put("a", "new_a")
     self.assertEquals(2, len(tst))
     self.assertEquals("new_a", tst.get("a"))
     self.assertTrue(tst.contains("b"))
     self.assertFalse(tst.contains("ab"))
Esempio n. 3
0
from tst import TST

tree = TST()

tree.put("apple", 100)

print(tree.get("apple"))
Esempio n. 4
0
class SuffixTree(MutableMapping):
    
    def __init__(self, *args, **kwargs):
        '''
        @params *args, **kwargs = passed to self.update see documentation for
            update for more info (basically a copy constructor) use like dict().

        eg:
            t = TST({'ab':12, 'cd':34}, sep=None)
            t = TST(((k, v) for k,v in {'ab':12, 'cd':34}.iteritems()), sep=None)
        '''
        self.tst = TST()
        self.update(*args, **kwargs)
    
    def find(self, substr): 
        if not substr:
            for k,v in self.iteritems():
                yield k,v
        root = None
        next = (self.tst.heads[ord(substr[0])], 1)
        while next:
            n, d = next
            if n == None:
              return
            if n.internal():
                if d == len(substr):
                    root = n
                    break;
                ch = substr[d]
                if   ch <  n.ch: next = (n.l, d);   continue
                elif ch == n.ch: next = (n.m, d+1); continue
                elif ch >  n.ch: next = (n.r, d);   continue
            elif n.key[:len(substr)] == substr:
                root = n
                break;
            return
        # now expand root
        q = deque()
        found = set()
        q.appendleft(root)
        while q:
            n = q.pop()
            if not n: continue
            if n.accepting:
                found |= n.val
            q.append(n.r)
            q.append(n.m)
            q.append(n.l)
        for k in found:
            yield k[1:], self.tst.get(k)

    def keys(self):
        return [k for k, v in self.iteritems()]
    
    def iteritems(self):
        q = deque()
        h = self.tst.heads[ord(START)]
        if h == None: return
        q.appendleft(h)
        while q:
            n = q.pop()
            if not n: continue
            if n.accepting:
                yield n.key[1:-1], n.val
            q.append(n.r)
            q.append(n.m)
            q.append(n.l)
    
    def __len__(self):
        return len(self.iteritems())

    def __setitem__(self, key, value):
        fullkey = START + key
        self.tst[fullkey] = value
        for i in xrange(0, len(key)):
            curkey = key[i:]
            keys = self.tst.get(curkey, set())
            keys.add(fullkey)
            self.tst[curkey] = keys

    def __getitem__(self, key):
        fullkey = START + key
        return self.tst[fullkey]

    def __delitem__(self, key):
        raise RuntimeError, 'Removing from SuffixTree is not allowed'

    def __iter__(self):
        for k,v in self.iteritems():
            yield k
    
    def __contains__(self, pattern):
        try:
            x = self[pattern]
        except KeyError:
            #try: return bool(tuple(self.find(pattern)))
            #except KeyError: return False
            return False
        return True

    def __str__(self):
        return str(dict(self))

    def __repr__(self):
        return str(self)