我们假定具有以下树结构:
a = [(1, 2), (2, 2), (3, 2), (4, 2), (5, 4), (6, 5), (7, 8), (8, 11), (9, 10), (10, 11), (11, 11)]
所以我们用这段代码Python - Generate a dictionary(tree) from a list of tuples得到了结构
[{'id': 2, 'Children': [{'id': 1}, {'id': 3}, {'id': 4, 'Children': [{'id': 5, 'Children': [{'id': 6}]}]}]}, {'id': 11, 'Children': [{'id': 8, 'Children': [{'id': 7}]}, {'id': 10, 'Children': [{'id': 9}]}]}]
我的问题:我怎样才能接受这本词典中一个特殊节点的所有子代? 例如:所有11个孩子都是:(7、8、9、10) 该怎么办?
答案 0 :(得分:0)
您可以将递归与生成器一起使用,以查找所需的节点子代。首先,为了便于以后查找,请使用递归来重构树:
data = [{'id': 2, 'Children': [{'id': 1}, {'id': 3}, {'id': 4, 'Children': [{'id': 5, 'Children': [{'id': 6}]}]}]}, {'id': 11, 'Children': [{'id': 8, 'Children': [{'id': 7}]}, {'id': 10, 'Children': [{'id': 9}]}]}]
def rebuild(d):
return {i['id']:None if 'Children' not in i else rebuild(i['Children']) for i in d}
result = rebuild(data)
现在,应用递归生成器函数:
def get_children(d):
for a, b in d.items():
yield a
if isinstance(b, dict):
yield from get_children(b)
print(sorted(get_children(result[11])))
输出:
[7, 8, 9, 10]