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"))
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"))
from tst import TST tree = TST() tree.put("apple", 100) print(tree.get("apple"))
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)