X-Git-Url: https://wannabe.guru.org/gitweb/?a=blobdiff_plain;f=collect%2Ftrie.py;h=547d67a4124abc07f425ecf21616bf2c509beb4e;hb=532df2c5b57c7517dfb3dddd8c1358fbadf8baf3;hp=3e4c9172fbbf3b01202f6c9ccc5b2d4ff607fcc1;hpb=fa4298fa508e00759565c246aef423ba28fedf31;p=python_utils.git diff --git a/collect/trie.py b/collect/trie.py index 3e4c917..547d67a 100644 --- a/collect/trie.py +++ b/collect/trie.py @@ -1,6 +1,15 @@ #!/usr/bin/env python3 -from typing import Any, Sequence +# © Copyright 2021-2022, Scott Gasch + +"""This is a Trie class, see: https://en.wikipedia.org/wiki/Trie. + +It attempts to follow Pythonic container patterns. See doctests +for examples. + +""" + +from typing import Any, Generator, Sequence class Trie(object): @@ -11,11 +20,13 @@ class Trie(object): for examples. """ + def __init__(self): self.root = {} self.end = "~END~" self.length = 0 self.viz = '' + self.content_generator: Generator[str] = None def insert(self, item: Sequence[Any]): """ @@ -241,9 +252,15 @@ class Trie(object): return None return [x for x in node if x != self.end] - def repr_fancy(self, padding: str, pointer: str, parent: str, node: Any, has_sibling: bool): + def repr_fancy( + self, + padding: str, + pointer: str, + node: Any, + has_sibling: bool, + ): if node is None: - return + return '' if node is not self.root: ret = f'\n{padding}{pointer}' if has_sibling: @@ -268,7 +285,7 @@ class Trie(object): has_sibling = False pointer += f'{child}' child_count -= 1 - ret += self.repr_fancy(padding, pointer, node, node[child], has_sibling) + ret += self.repr_fancy(padding, pointer, node[child], has_sibling) return ret def repr_brief(self, node, delimiter): @@ -281,7 +298,7 @@ class Trie(object): >>> t.insert([10, 10, 10, 1]) >>> t.insert([10, 10, 10, 2]) >>> t.repr_brief(t.root, '.') - '10.[0.0.[1, 2], 10.10.[1, 2]]' + '10.[0.0.[1,2],10.10.[1,2]]' """ child_count = 0 @@ -291,11 +308,11 @@ class Trie(object): child_count += 1 child_rep = self.repr_brief(node[child], delimiter) if len(child_rep) > 0: - my_rep += str(child) + delimiter + child_rep + ", " + my_rep += str(child) + delimiter + child_rep + "," else: - my_rep += str(child) + ", " + my_rep += str(child) + "," if len(my_rep) > 1: - my_rep = my_rep[:-2] + my_rep = my_rep[:-1] if child_count > 1: my_rep = f'[{my_rep}]' return my_rep @@ -323,9 +340,10 @@ class Trie(object): └──2 """ - return self.repr_fancy('', '*', self.root, self.root, False) + return self.repr_fancy('', '*', self.root, False) if __name__ == '__main__': import doctest + doctest.testmod()