在堆中使用元组进行多维排序?

时间:2012-09-30 04:44:40

标签: python algorithm heapsort

说我有一个列表如:

[(3,4), (4,3), (1,5), (5,1), (2,6), (6,2)]

我希望返回具有最低x值的元组,以及具有最低y值的元组。

是否可以使用索引0构建(min-)堆,使用索引1构建不同的堆?这会产生两堆:

for x: [(1,5), (2,6), (3,4), (4,3), (5,1), (6,2)]
#and
for y: [(5,1), (6,2), (4,3), (3,4), (1,5), (2,6)].

我们可以使用heapsort作为元组吗?

1 个答案:

答案 0 :(得分:3)

答案是肯定的,你可以在元组上使用heapsort

  

堆元素可以是元组。这对于在跟踪的主记录旁分配比较值(例如任务优先级)非常有用......

但是mentioned in the docs也是{<3}}:

  

[nsmallest和nlargest]对较小的n值表现最佳。对于较大的值,使用sorted()函数更有效。此外,当n == 1时,使用内置的min()和max()函数效率更高。

也就是说,如果您想要最小y,请使用min

tuple_list = [(3,4), (4,3), (1,5), (5,1), (2,6), (6,2)]

min(tuple_list, key=lambda x: x[1])
# (5,1)

如果您想对整个列表进行排序,请使用sorted

sorted(tuple_list, key=lambda x: x[1])
# [(5,1), (6,2), (4,3), (3,4), (1,5), (2,6)]

如果您想使用三个最小值,请使用heapq.nsmallest

heapq.nsmallest(3, tuple_list, key=lambda x: x[1])
# [(5,1), (6,2), (4,3)]