Python对元组列表排序
这里是一个列表:
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]
排序的,就像你的例子一样。