简体   繁体   English

如何创建家谱?

[英]How to create Family tree?

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. 与计算机系统目录相同的样式。

This is just inspectorG4dget's answer which was almost there but needs some alterations: 这只是检查器G4dget的答案,几乎在那里,但需要一些改动:

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. 根据上面的注释,您需要在程序开头import itertools

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

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 : 然后,如果要打印出树结构,请给出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 希望这可以帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM