如何进行逻辑排序

时间:2019-03-19 19:54:41

标签: python

具有四个字典grandpadadson_1son_2

grandpa = {'name': 'grandpa', 'parents': []}
dad = {'name': 'dad', 'parents': ['grandpa']}
son_1 = {'name': 'son_1', 'parents': ['dad']}
son_2 = {'name': 'son_2', 'parents': ['dad']}
relatives = [son_1, grandpa, dad, son_2]

我想编写一个函数,以“反向”顺序对所有这些亲戚进行排序。 因此,将使用parents列表来代替children。最旧的grandpa将在result字典的顶层,dad将在其下面的children列表中,存储son_1和{{1} }:

son_2

哪个会打印:

def sortRelatives(relatives):
    # returns a resulted dictionary:
    # logic


result = sortRelatives(relatives)
print result 

如何使result = {'name': 'grandpa', 'children': [ {'name': 'dad', 'children': [{'name': 'son_1', 'children': [] }, {'name': 'son_2', 'children': [] }] } ] } 函数执行这种排序?

1 个答案:

答案 0 :(得分:1)

我认为可行且简单的解决方案是首先构建儿童字典,该字典将人名映射到他们的孩子。然后,我们可以使用新的数据结构来构建输出:

from collections import defaultdict

def children(relatives):
    children = defaultdict(list)
    for person in relatives:
        for parent in person['parents']:
            children[parent].append(person)
    return children

我们可以使用的另一个工具是可以找到家谱根源的函数:

def genealogy_root(relatives):
    for person in relatives:
        if not person['parents']:
            return person
    raise TypeError("This doesn't look like a valid genealogy.")

这将帮助我们找到没有父母的人,因此将成为我们家谱树的根源。现在我们有了所有必需的工具,我们只需要构建输出:

def build_genealogy(relatives):
    relatives_children = children(relatives)

    def sub_genealogy(current_person):
        name = current_person['name']
        return dict(
            name=name,
            children=[sub_genealogy(child) for child in relatives_children[name]] 
        )

    root = genealogy_root(relatives)
    return sub_genealogy(root)

result = build_genealogy(relatives)
print(result)

哪个输出:

{
  'name': 'grandpa', 'children': [
     {'name': 'dad', 'children': [
         {'name': 'son_1', 'children': []}, 
         {'name': 'son_2', 'children': []}
     ]}
  ]
}

请注意,正如我在评论中所说,这仅是有效的,因为没有名称重复。如果几个人使用相同的名字,那么您将必须具有更好的数据结构作为输入。例如,您可能想要具有以下内容:

grandpa = {'name': 'grandpa', 'parents': []}
dad = {'name': 'dad', 'parents': [grandpa]}
son_1 = {'name': 'son_1', 'parents': [dad]}
son_2 = {'name': 'son_2', 'parents': [dad]}
relatives = [grandpa, dad, son_1, son_2]