擅长:python、mysql、java
<p>正如所评论的(并反映在编辑的问题中),这种称为<a href="https://en.wikipedia.org/wiki/Topological_sorting" rel="nofollow noreferrer">topological sorting</a>的排序类型无法通过Python内置的<code>sort</code>实现。相反,它可以使用<em>pip</em>-installable库<a href="https://pypi.org/project/toposort/" rel="nofollow noreferrer">toposearch</a>来完成,该库将在下一个Python-3.9中作为内置库提供</p>
<p>以下是使用toposearch库对问题的回答:</p>
<pre><code>from toposort import toposort_flatten
lst_sorted = toposort_flatten({i['id']:{i['parent']} for i in arry})
# => ['', 'Ann', 'Nik', 'Bob']
lst_rev = list(reversed(lst_sorted[1:]))
# => ['Bob', 'Nik', 'Ann']
[next(x for x in arry if x['id']==j) for j in lst_rev]
# => [{'id': 'Bob', 'parent': 'Nik'},
# {'id': 'Nik', 'parent': 'Ann'},
# {'id': 'Ann', 'parent': ''}]
</code></pre>
<p><strong>说明:</strong><br/>
toposort库中的两个函数都需要一个类型为<code>Dict[Any, Set[Any]]</code>的简单对象。在上面的代码片段中,从<code>arry</code>(问题所在)到类型为<code>toposort_flatten</code>的字典进行简单转换。最后,它被转换回一组原始词典的(拓扑排序)列表</p>