具有四个字典grandpa
,dad
,son_1
和son_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': [] }] }
]
}
函数执行这种排序?
答案 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]