How to create Family tree?
Question:
Having dictionary with family members how can I create a tree of it?
Dictionary have a structure that looks like this:
{'parent':'Smith', 'children':[
{'parent':'Connor', 'children':[
{'parent':'Alexis','children':[
{'parent':'Joe', 'children':[
{'parent':'Clark','children':[]}]}]},
{'parent':'Sue','children':[]}]},
{'parent':'Cooper', 'children':[
{'parent':'Max','children':[
{'parent':'Luis', 'children':[]},]},
{'parent':'Elvis', 'children':[]},
{'parent':'Steven', 'children':[]}]}]}
After creating family tree, how can I check some dates such as:
how to check how many members got entire family or single family of tree.
check how big is entire family tree root or some part of family.
how can I add new members to existing position or to new position inside family tree?
Edit
Adding example of tree:
Smith
Conor
Alexis
Joe
Clark
Sue
Cooper
Max
Luis
Elvis
Steven
Same style as computer system directory.
Answers:
Untested, but this should do it
class Person:
ID = itertools.count()
def __init__(self):
self.id = next(self.__class__.ID)
self.parent = None
self.children = []
def createTree(familyTreeDict, parent=None):
if not familyTreeDict:
return []
else:
members = []
for name familyTreeDict:
members.append(Person(name))
members[-1].parent = parent
for child in familyTreeDict[name]:
members[-1].children.append(createTree(child, members[-1]))
return members
Then, if you want to print out a tree structure, given the output from createTree
:
def printout(family, indent=0):
for parent in family:
print 't'*indent, parent.name
for child in parent.children:
printout(child, indent+1)
Hope this helps
This is just inspectorG4dget’s answer which was almost there but needs some alterations:
class Person:
ID = itertools.count()
def __init__(self, name, parent=None, level=0):
self.id = self.__class__.ID.next() # next(self.__class__.ID) in python 2.6+
self.parent = parent
self.name = name
self.level = level
self.children = []
def createTree(d, parent=None, level=0):
if d:
member = Person(d['parent'], parent, level)
level = level + 1
member.children = [createTree(child, member, level) for child in d['children']]
return member
t = createTree(my_tree) # my_tree is the name of your dictionary
def printout(parent, indent=0):
print 't'*indent, parent.name
for child in parent.children:
printout(child, indent+1)
printout(t)
As per the comment above, you need to import itertools
at the beginning of the programme.
EDIT: A function to flatten the tree should serve for everything else you want to do:
def flatten(parent):
L = [parent]
for child in parent.children:
L += flatten(child)
return L
flattened_tree = flatten(t)
print "All members: ", [person.name for person in flattened_tree]
print "Number of members:", len(flattened_tree)
print "Number of levels:", max([person.level for person in flattened_tree]) + 1
cooper = flattened_tree[6]
cooper_fl = flatten(cooper)
print "Members below Cooper: ", [person.name for person in cooper_fl]
print "Number:", len(cooper_fl)
levels = [person.level for person in cooper_fl]
print "Number of levels:", max(levels) - min(levels) + 1
Having dictionary with family members how can I create a tree of it?
Dictionary have a structure that looks like this:
{'parent':'Smith', 'children':[
{'parent':'Connor', 'children':[
{'parent':'Alexis','children':[
{'parent':'Joe', 'children':[
{'parent':'Clark','children':[]}]}]},
{'parent':'Sue','children':[]}]},
{'parent':'Cooper', 'children':[
{'parent':'Max','children':[
{'parent':'Luis', 'children':[]},]},
{'parent':'Elvis', 'children':[]},
{'parent':'Steven', 'children':[]}]}]}
After creating family tree, how can I check some dates such as:
how to check how many members got entire family or single family of tree.
check how big is entire family tree root or some part of family.
how can I add new members to existing position or to new position inside family tree?
Edit
Adding example of tree:
Smith
Conor
Alexis
Joe
Clark
Sue
Cooper
Max
Luis
Elvis
Steven
Same style as computer system directory.
Untested, but this should do it
class Person:
ID = itertools.count()
def __init__(self):
self.id = next(self.__class__.ID)
self.parent = None
self.children = []
def createTree(familyTreeDict, parent=None):
if not familyTreeDict:
return []
else:
members = []
for name familyTreeDict:
members.append(Person(name))
members[-1].parent = parent
for child in familyTreeDict[name]:
members[-1].children.append(createTree(child, members[-1]))
return members
Then, if you want to print out a tree structure, given the output from createTree
:
def printout(family, indent=0):
for parent in family:
print 't'*indent, parent.name
for child in parent.children:
printout(child, indent+1)
Hope this helps
This is just inspectorG4dget’s answer which was almost there but needs some alterations:
class Person:
ID = itertools.count()
def __init__(self, name, parent=None, level=0):
self.id = self.__class__.ID.next() # next(self.__class__.ID) in python 2.6+
self.parent = parent
self.name = name
self.level = level
self.children = []
def createTree(d, parent=None, level=0):
if d:
member = Person(d['parent'], parent, level)
level = level + 1
member.children = [createTree(child, member, level) for child in d['children']]
return member
t = createTree(my_tree) # my_tree is the name of your dictionary
def printout(parent, indent=0):
print 't'*indent, parent.name
for child in parent.children:
printout(child, indent+1)
printout(t)
As per the comment above, you need to import itertools
at the beginning of the programme.
EDIT: A function to flatten the tree should serve for everything else you want to do:
def flatten(parent):
L = [parent]
for child in parent.children:
L += flatten(child)
return L
flattened_tree = flatten(t)
print "All members: ", [person.name for person in flattened_tree]
print "Number of members:", len(flattened_tree)
print "Number of levels:", max([person.level for person in flattened_tree]) + 1
cooper = flattened_tree[6]
cooper_fl = flatten(cooper)
print "Members below Cooper: ", [person.name for person in cooper_fl]
print "Number:", len(cooper_fl)
levels = [person.level for person in cooper_fl]
print "Number of levels:", max(levels) - min(levels) + 1