Python获取嵌套类的最后一个类

2024-04-19 11:59:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为我的worldbuilding web应用程序创建一个族谱功能,我使用的数据来自一个列表,我使用的示例如下:

            # PERSON                # SPOUSE             # MOTHER          # FATHER             # SEX       # HOUSE
listChars = [['Ned Stark',          'Catelyn Tully',    'Lyarra Stark',     'Rickard Stark',    'Male',     'Stark'],
             ['Catelyn Tully',      'Ned Stark',        'Minisa Whent',     'Hoster Tully',     'Female',   'Stark'],
             ['Robb Stark',         'Talisa Maegyr',    'Catelyn Tully',    'Ned Stark',        'Male',     'Stark'],
             ['Bran Stark',         'None',             'Catelyn Tully',    'Ned Stark',        'Male',     'Stark'],
             ['Sansa Stark',        'Tyrion Lannister', 'Catelyn Tully',    'Ned Stark',        'Female',   'Stark'],
             ['Tywin Lannister',    'Joanna Lannister', 'Jeyne Marbrand',   'Tytos Lannister',  'Male',     'Lannister'],
             ['Jaime Lannister',    'Cersei Lannister', 'Joanna Lannister', 'Tywin Lannister',  'Male',     'Lannister'],
             ['Cersei Lannister',   'Jaime Lannister',  'Joanna Lannister', 'Tywin Lannister',  'Female',   'Lannister'],
             ['Tyrion Lannister',   'Sansa Stark',      'Joanna Lannister', 'Tywin Lannister',  'Male',     'Lannister'],
             ['Joffrey Baratheon',  'None',             'Cersei Lannister', 'Jaime Lannister',  'Male',     'Lannister'],
             ['Myrcella Baratheon', 'None',             'Cersei Lannister', 'Jaime Lannister',  'Female',   'Lannister'],
             ['Tommen Baratheon',   'None',             'Cersei Lannister', 'Jaime Lannister',  'Male',     'Lannister'],
             ['Rickon Stark',       'None',             'Talisa Maegyr',    'Robb Stark',       'Male',     'Stark'],
             ['Lyanna Lannister',   'None',             'Sansa Stark',      'Tyrion Lannister', 'Male',     'Lannister']]

到目前为止,我已经创建了两个类:HouseholdFamilyHousehold类包含房屋名称、没有更多祖先/父母的房屋的顶级父/母以及顶级父/子。它还有一个families列表,其中包含顶级父级和子级的家族(一个Family类实例的列表)。Family类有它的父母、房子、孩子和一个家庭列表(用于顶级父母的孩子的孩子)。以下是两个类的代码:

class Family:
    def __init__(self,parents,house):
        self.parents=parents
        self.house = house
        self.children=self.getChildren()
        self.families=self.createFamilies()

    def getChildren(self):
        childs = [row[0] for row in listChars if (row[2]==self.parents[1] and row[3]==self.parents[0]) or (row[2]==self.parents[0] and row[3]==self.parents[1])]
        return childs

    def createFamilies(self):
        family_list = []                
        for child in self.children:
            childRow = [row for row in listChars if row[0]==child][0]
            # if child has no spouse, no family
            if childRow[1] != 'None':
                if family_list !=[]:
                    for f in family_list:
                        if childRow[0] not in family_list and childRow[0] not in f.parents: # deals with a Jaime/Cersei scenario
                            family_list.append(Family((childRow[0],childRow[1]),self.house))
                else:
                    family_list.append(Family((childRow[0],childRow[1]),self.house))
        return family_list

    def __repr__(self):
        return '<Family parents:%s, children:%s>' % (self.parents,self.children)

class Household:
    def __init__(self,house,parents):
        self.house=house
        self.parents=parents
        self.children = self.getChildren()
        self.families=self.createFamilies()

    def getChildren(self):
        childs = [row[0] for row in listChars if row[2]==self.parents[0] or row[3]==self.parents[1]]
        return childs

    def createFamilies(self):
        fams = []
        for child in self.children:
            childRow = [row for row in listChars if row[0]==child][0]
            if childRow[1] != 'None':
                fams.append(Family((childRow[0],childRow[1]),self.house))
        return fams

    def __repr__(self):
        return '<Household house:%s, top-parents:%s, children:%s>' % (self.house,self.parents,self.children)

然后我创建家庭实例并将它们放在household_list

parents = list(set([(r[2],r[3]) for r in listChars])) # list of parents, no duplicates
parentsTop = {}.fromkeys(parents)

names = [r[0] for r in listChars]

# TRUE if parents TOP of household, FALSE if not
parentsTop = {p:([True] if p[0] not in names and p[1] not in names else [False]) for p in parentsTop}

# for now, get House as fathers last name
for p in parentsTop:
    if parentsTop[p]==[True]:
        parentsTop[p].append(p[1].split(' ')[-1])

household_list=[Household(parentsTop[ps][1],ps) for ps in parentsTop if parentsTop[ps][0]==True]

这样做的目的是以一种可以读取到.yml文件的方式进行格式化,然后使用kingraph创建数据的svg

目前,我想知道如何才能访问家庭中的所有家庭。例如,现在我知道,对于“兰尼斯特”家庭来说,它会被称为(最后一个男性):“泰托斯”->;'Tywin'->;'詹姆->;乔弗里,所以有两个层次的家庭实例。如果我不知道有多少层,我怎么能遍历所有的族实例呢?我很感激任何建议和正确方向的任何观点。谢谢


Tags: inselfnoneforiffamilymalelist