Python排序成对的列表

Python排序成对的列表,python,list,Python,List,名单如下: list = [[1, 0], [2, 0], [3, 0], [4, 2], [5, 2], [6, 5], [7, 6], [8,0]] 将该对中的两个值中的每一个都视为item和parent[item,parent]。父项将项引用为父项 排序后,列表应如下所示: list = [[1, 0], [2, 0], [4, 2], [5, 2], [3, 0], [6, 5], [7, 6], [8, 0]] 如您所见,父项不是0的每个项都放在对应项父项==项的对后面。如果有两个

名单如下:

list = [[1, 0], [2, 0], [3, 0], [4, 2], [5, 2], [6, 5], [7, 6], [8,0]]
将该对中的两个值中的每一个都视为item和parent[item,parent]。父项将项引用为父项

排序后,列表应如下所示:

list = [[1, 0], [2, 0], [4, 2], [5, 2], [3, 0], [6, 5], [7, 6], [8, 0]]
如您所见,父项不是0的每个项都放在对应项父项==项的对后面。如果有两个或两个以上的数字具有相同的父项,则具有较低项的数字优先

我试图以最优雅的方式实现这一点,但它令人惊讶地棘手。
有什么想法吗?

这里有一个方法可以实现你想要实现的目标

unsorted = [[1, 0], [2, 0], [3, 0], [4, 2], [5, 2], [6, 5], [7, 6], [8,0]]
sortList = []
sortDict = {}

for x in unsorted:
    if x[1] != 0:
        if x[1] in sortDict:
            sortDict[x[1]].append(x[0])
        else:
            sortDict[x[1]] = [x[0]]

for x in unsorted:
    if x[1] == 0:
        sortList.append(x)
    if x[0] in sortDict:
        sortList.extend([[y, x[0]] for y in sortDict[x[0]]])

print(sortList)
结果:

[[1, 0], [2, 0], [4, 2], [5, 2], [3, 0], [6, 5], [7, 6], [8, 0]]
我会继续努力让它变得更小更好,但这可能是实现你要求的唯一方法。
我假设起始列表按x[0]排序,如您的示例所示。

为什么3,0和8,0最后一个我不明白为什么在最末尾有[3,0]、[8,0],在最开始有[1,0]、[2,0]。但中间部分是有道理的。我写道:每个项都有一个不是0的父项。表示具有0的项没有父项。这就是重点。我认为你的例子是错误的,[[1,0],[2,0],[4,2],[5,2],[3,0],[6,5],[7,6],[8,0]]可能应该是答案。你是对的,我会改变它。