I was reading the gist @https://gist.github.com/2012250
I found the autovivification functionality of it pretty cool. If only I could have a parent reference...
Obviously this was not going to be a one-line tree. But that wasn't the goal
A simple variant:
from collections import defaultdict
class Tree(defaultdict):
def initFun(self):
return Tree(self)
def __init__(self, parent=None):
self.parent = parent
defaultdict.__init__(self, self.initFun)
a = Tree()
a['1']['2'] = 3
a['1']['3']['4'] = 4
a['1']['3'].parent['2']
>>> 3
UPDATE Rhomboid suggested this solution on reddit
from collections import defaultdict
class Tree(defaultdict):
def __init__(self, parent=None):
self.parent = parent
defaultdict.__init__(self, lambda: Tree(self))
And a more elaborate variant which can take in Json or other dicts
from collections import default
from json import loads, dumps
class Tree(defaultdict):
def __init__(self, inp=None, parent=None):
self.parent = parent
defaultdict.__init__(self, lambda: Tree(None, self))
if inp is not None:
if isinstance(inp, basestring):
self.update(loads(inp))
else:
self.update(inp)
def __str__(self, *args, **kwargs):
return dumps(self, sort_keys=True, indent=4)l
if __name__ == "__main__":
a = Tree()
a['1']['2'] = 3
a['1']['3']['4'] = 4
a['1']['3'].parent['2']
print a
b = Tree({"1": 1, "2": {"1": 3}})
print b
c = Tree('{"1": 1, "2": {"1": 3}}')
print c
a:
{
"1": {
"3": {
"4": 4
},
"2": 3
}
}
b:
{
"1": 1,
"2": {
"1": 3
}
}
c:
{
"1": 1,
"2": {
"1": 3
}
}