簡體   English   中英

如何創建家譜?

[英]How to create Family tree?

擁有家庭成員的字典如何創建它的樹?

字典的結構如下所示:

{'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

與計算機系統目錄相同的樣式。

這只是檢查器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)

根據上面的注釋,您需要在程序開頭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

未經測試,但這應該做到

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)

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM