1

假设我有一个列表,例如:

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

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

是否可以使用索引 0 构建(最小)堆,使用索引 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)].

我们可以对元组使用堆排序吗?

4

1 回答 1

3

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

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

但是,文档中也提到

[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)]
于 2012-09-30T13:44:44.573 回答