你不能用直接排序来做到这一点,首先从你的列表中构建一棵树。您需要两个信息:树中的顶级节点列表(没有父节点的节点或不存在父节点的子节点)和父/子关系:
def build_tree(l):
exists = set(map(lambda x : x['id'], l))
tops = []
children = {}
for e in l:
parent = e['parent']
if not parent:
tops.append(e)
continue
parent = int(parent[1:])
if parent not in exists:
tops.append(e)
continue
if parent in children:
children[parent].append(e)
else:
children[parent] = [ e ]
return children, tops
然后使用递归函数对该树进行深度优先遍历:
def build_list(children, top):
l = [ top ]
if top['id'] in children:
for child in children[top['id']]:
l += build_list(children, child)
return l
第一个函数为您提供子/关系结构,而第二个函数让您为每个可能的顶部节点构建一个列表。
现在您可以使用这两个函数对列表进行排序:
l = [{'parent': u'#5963','id': 5962},{'parent': u'','id': 5963},
{'parent': u'#5963', 'id': 5964}, {'parent': u'#5966', 'id': 5967},
{'parent': u'#5963','id': 5966}, {'parent': u'#5962','id': 5968} ]
children, tops = build_tree(l)
for top in tops:
print build_list(children, top)
# outputs : [{'id': 5963, 'parent': u''}, {'id': 5962, 'parent': u'#5963'},
# {'id': 5968, 'parent': u'#5962'}, {'id': 5964, 'parent': u'#5963'},
# {'id': 5966, 'parent': u'#5963'}, {'id': 5967, 'parent': u'#5966'}]
如果删除节点 5963,则会给出:
[{'id': 5962, 'parent': u'#5963'}, {'id': 5968, 'parent': u'#5962'}]
[{'id': 5964, 'parent': u'#5963'}]
[{'id': 5966, 'parent': u'#5963'}, {'id': 5967, 'parent': u'#5966'}]