Python对元组列表排序

-6 投票
1 回答
2053 浏览
提问于 2025-04-18 09:14

这里是一个列表:

list = [[1, 0], [2, 0], [3, 0], [4, 2], [5, 2], [6, 5], [7, 6], [8,0]]

可以把每对中的两个值想象成一个项目编号(item#),而“parent”就是指这个项目的父项,也就是它的项目编号。

当这个列表排序后,应该看起来像这样:

list = [[1, 0], [2, 0], [4, 2], [5, 2], [3, 0], [6, 5], [7, 6], [8, 0]]

你会发现,每个父项不为0的项目,都会被放在与其对应的父项(parent == item#)后面。如果有两个或更多的项目有相同的父项,那么项目编号较小的会排在前面。

我想以最优雅的方式实现这个功能,但这 surprisingly tricky(出乎意料的棘手)。有什么好的想法吗?

1 个回答

1

这里有一个方法可以实现你想要的效果。

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] 排序的,就像你的例子一样。

撰写回答