2012-12-02 40 views
0

与家人共享词典我如何创建一棵树?如何创建家谱?

字典有看起来像这样的结构:

{'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':[]}]}]} 

创建家谱,我怎么能检查一些日期,如后: 如何检查多少成员得到了整个家庭或树的单家独户。

检查整个家族树根或家庭的某个部分有多大。

如何将新成员添加到家庭树内的现有位置或新位置?树

编辑

添加例如:

Smith 
    Conor 
     Alexis 
      Joe 
       Clark 
     Sue 
    Cooper 
     Max 
      Luis 
     Elvis 
     Steven 

相同的样式计算机系统目录下。

+1

为什么你认为字典是不是已经一棵树?树是什么意思? –

+0

@RayToal,增加例子:) – Infinity00

+2

老兄,你的'dict'已经是一棵树了。你在“树”里想要的东西是不是已经在'dict'中实现了? – inspectorG4dget

回答

2

这只是inspectorG4dget的答案,几乎在那里,但需要一些改变:

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) 

根据上面的注释,您需要在程序开始时import itertools

编辑:扁平化树中的功能应该服务于一切你想做的事:

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 
+0

他们应该像Facebook上的按钮一样实现...呃... 它的工作:) 当我想要添加新成员到家谱时,该怎么办? 't.count()' - > 11统计了树的所有成员 't.root()' - > 5全族最大树根为5个。 't.children()[0] .count() ' - >共有5个孩子 't.children()[1] .root()' - > 3从'cooper'开始,结束于'luis' – Infinity00

+0

呃,左边有一个向上的箭头,很多像'喜欢'在Facebook上!你也可以接受答案。 – Stuart

+0

啊,我刚刚读完这个精彩网站的规则,我只能选择1个正确答案:s ur或inspectorG4dget? 你可以检查并告诉我如何将这些选项添加到课堂上吗? – Infinity00

0

未经检验的,但是这应该这样做

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 

然后,如果你想打印出一个树状结构,给出从createTree输出:

def printout(family, indent=0): 
    for parent in family: 
     print '\t'*indent, parent.name 
     for child in parent.children: 
      printout(child, indent+1) 

希望这有助于

+0

出现错误:'ID = itertools.count() NameError:名称'itertools'未定义' 和'for family familyTreeDict:'您忘记添加'in' – Infinity00

+0

import itertools ....你应该可以阅读一些关于python的文档。org如果那个位投掷你一个曲线球 – Chrismit

+0

im初学者在编码世界和python是我的第一个脚本leangueg。 :( 后导入'itertool'并试图'打印输出'它给了我错误'打印输出(D)','D'是所有家谱的变种:'print'\ t'* indent,parent.name AttributeError: 'str'对象没有属性'name'' – Infinity00