git.fiddlerwoaroof.com
Raw Blame History
a = {

    0: set([1, 14, 16, 17, 19, 20, 21, 22]), 

    1: set([2]), 

    2: set([]), 

    14: set([15]), 

    15: set([]), 

    16: set([18]), 

    17: set([]), 

    18: set([]), 

    19: set([]), 

    20: set([]), 

    21: set([]), 

    22: set([])

}

def lookup(lis, table):

    cset = table[lis.pop(0)]

    ckey = None

    for x in lis[:-1]:

        if x in cset: 

            ckey = x

            cset = table[x]

            print x, cset

        else:

            raise Exception()

    if lis[-1] in cset:

        key = lis[-1]

        return key, table[key]

    else:

        raise Exception()



import UserDict

import operator

class Tree(object, UserDict.DictMixin):

    def __init__(self, table, root):

        self.key = root

        self.filled = False

        self.children = {}

        if root in table:

            result = []

            for child in table[root]:

                result.append((child, Tree(table, child)))

            self.filled = True

            self.children.update(result)

        

    def __getitem__(self, key):

        if hasattr(key, '__iter__'): 

            return self.find([self.key] + list(key))

        return self.children[key]

    def keys(self): 

        return self.children.keys()

    def find(self, path):

        if len(path) == 1:

            return self

        else:

            value = self[path[1]]

            if value is not None:

                value = value.find(path[1:])

                return value

    def __str__(self): 

        return '\n'.join(self.mkstrtree(0))

    def mkstrtree(self, level, space='--'):

        result = [space*level+str(level+1)+space+str(self.key)]

        for id, child in self.children.items():

            result.extend(child.mkstrtree(level+1)) 

        return result

    def mktree(self):

        result = {}

        def setitem(dict, key, value): dict[key] = value

        for key, value in self.children.items():

            if value.filled:

                setitem(result, key, value.mktree()) 

            else:

                setitem(result, key, None) 

        return result

    def count(self):

        return len(self) + reduce(operator.add, 

                                  [x.count() for x in self.children.values()], 

                                  0)

                                 



b = Tree(a, 135);print b