Advertisement
here2share

# trie_class.py

May 6th, 2015
349
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.56 KB | None | 0 0
  1. # trie_class.py
  2.  
  3. class Trie:
  4.  
  5.     def __init__(self):
  6.         self.path = {}
  7.         self.value = None
  8.         self.value_valid = False
  9.  
  10.     def __setitem__(self, key, value):
  11.         head = key[0]
  12.         if head in self.path:
  13.             node = self.path[head]
  14.         else:
  15.             node = Trie()
  16.             self.path[head] = node
  17.  
  18.         if len(key) > 1:
  19.             remains = key[1:]
  20.             node.__setitem__(remains, value)
  21.         else:
  22.             node.value = value
  23.             node.value_valid = True
  24.  
  25.     def __delitem__(self, key):
  26.         head = key[0]
  27.         if head in self.path:
  28.             node = self.path[head]
  29.             if len(key) > 1:
  30.                 remains = key[1:]
  31.                 node.__delitem__(remains)
  32.             else:
  33.                 node.value_valid = False
  34.                 node.value = None
  35.             if len(node) == 0:
  36.                 del self.path[head]
  37.  
  38.     def __getitem__(self, key):
  39.         head = key[0]
  40.         if head in self.path:
  41.             node = self.path[head]
  42.         else:
  43.             raise KeyError(key)
  44.         if len(key) > 1:
  45.             remains = key[1:]
  46.             try:
  47.                 return node.__getitem__(remains)
  48.             except KeyError:
  49.                 raise KeyError(key)
  50.         elif node.value_valid:
  51.             return node.value
  52.         else:
  53.             raise KeyError(key)
  54.  
  55.     def __contains__(self, key):
  56.         try:
  57.             self.__getitem__(key)
  58.         except KeyError:
  59.             return False
  60.         return True
  61.  
  62.     def __len__(self):
  63.         n = 1 if self.value_valid else 0
  64.         for k in self.path.keys():
  65.             n = n + len(self.path[k])
  66.         return n
  67.  
  68.     def get(self, key, default=None):
  69.         try:
  70.             return self.__getitem__(key)
  71.         except KeyError:
  72.             return default
  73.  
  74.     def nodeCount(self):
  75.         n = 0
  76.         for k in self.path.keys():
  77.             n = n + 1 + self.path[k].nodeCount()
  78.         return n
  79.  
  80.     def keys(self, prefix=[]):
  81.         return self.__keys__(prefix)
  82.  
  83.     def __keys__(self, prefix=[], seen=[]):
  84.         result = []
  85.         if self.value_valid:
  86.             isStr = True
  87.             val = ""
  88.             for k in seen:
  89.                 if type(k) != str or len(k) > 2:
  90.                     isStr = False
  91.                     break
  92.                 else:
  93.                     val += k
  94.             if isStr:
  95.                 result.append(val)
  96.             else:
  97.                 result.append(prefix)
  98.         if len(prefix) > 0:
  99.             head = prefix[0]
  100.             prefix = prefix[1:]
  101.             if head in self.path:
  102.                 nextpaths = [head]
  103.             else:
  104.                 nextpaths = []
  105.         else:
  106.             nextpaths = self.path.keys()                
  107.         for k in nextpaths:
  108.             nextseen = []
  109.             nextseen.extend(seen)
  110.             nextseen.append(k)
  111.             result.extend(self.path[k].__keys__(prefix, nextseen))
  112.         return result
  113.  
  114.     def __iter__(self):
  115.         for k in self.keys():
  116.             yield k
  117.         raise StopIteration
  118.  
  119.     def __add__(self, other):
  120.         result = Trie()
  121.         result += self
  122.         result += other
  123.         return result
  124.  
  125.     def __sub__(self, other):
  126.         result = Trie()
  127.         result += self
  128.         result -= other
  129.         return result
  130.  
  131.     def __iadd__(self, other):
  132.         for k in other:
  133.             self[k] = other[k]
  134.         return self
  135.  
  136.     def __isub__(self, other):
  137.         for k in other:
  138.             del self[k]
  139.         return self
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement