使用 heapq 对元组进行排序
Sorting tuples with heapq
我正在使用 heapq
模块对元组列表进行堆排序。
但是,对于第一个元组的键,heapq 不会自动回退到下一个键:
import heapq
x = [(3, 0, 0), (6, 0, 1), (2, 1, 0), (3, 1, 1)]
heapq.heapify(x)
print(x)
将打印:
[(2, 1, 0), (3, 1, 1), (3, 0, 0), (6, 0, 1)]
我预计 (3, 0, 0)
应该在 (3, 1, 1)
之前。我需要指定自定义的比较方法吗?或者我该如何进行这项工作?
如文档所述,
its smallest element is always the root, heap[0]
但这并不意味着其他元素是有序的。调用 heapify()
后,你得到
[(2, 1, 0), (3, 1, 1), (3, 0, 0), (6, 0, 1)]
当您删除第一个(最小的)项目时,堆将自行重新排序:
heapq.heappop(x) # returns (2, 1, 0)
print(x)
给予
[(3, 0, 0), (3, 1, 1), (6, 0, 1)]
要获得完整的有序列表,请按照 examples.
中所述实施 heapsort()
函数
要使用 heapq
模块对元组列表进行排序,您可以实现 heapsort()
函数,如文档的 Basic Examples 部分所示:
from heapq import heappop, heappush
def heapsort(iterable):
h = []
for value in iterable:
heappush(h, value)
return [heappop(h) for i in range(len(h))]
x = [(3, 0, 0), (6, 0, 1), (2, 1, 0), (3, 1, 1)]
res = heapsort(x)
print(res) # -> [(2, 1, 0), (3, 0, 0), (3, 1, 1), (6, 0, 1)]
如您所见,(3, 0, 0)
将按预期出现在 (3, 1, 1)
之前。
我正在使用 heapq
模块对元组列表进行堆排序。
但是,对于第一个元组的键,heapq 不会自动回退到下一个键:
import heapq
x = [(3, 0, 0), (6, 0, 1), (2, 1, 0), (3, 1, 1)]
heapq.heapify(x)
print(x)
将打印:
[(2, 1, 0), (3, 1, 1), (3, 0, 0), (6, 0, 1)]
我预计 (3, 0, 0)
应该在 (3, 1, 1)
之前。我需要指定自定义的比较方法吗?或者我该如何进行这项工作?
如文档所述,
its smallest element is always the root, heap[0]
但这并不意味着其他元素是有序的。调用 heapify()
后,你得到
[(2, 1, 0), (3, 1, 1), (3, 0, 0), (6, 0, 1)]
当您删除第一个(最小的)项目时,堆将自行重新排序:
heapq.heappop(x) # returns (2, 1, 0)
print(x)
给予
[(3, 0, 0), (3, 1, 1), (6, 0, 1)]
要获得完整的有序列表,请按照 examples.
中所述实施heapsort()
函数
要使用 heapq
模块对元组列表进行排序,您可以实现 heapsort()
函数,如文档的 Basic Examples 部分所示:
from heapq import heappop, heappush
def heapsort(iterable):
h = []
for value in iterable:
heappush(h, value)
return [heappop(h) for i in range(len(h))]
x = [(3, 0, 0), (6, 0, 1), (2, 1, 0), (3, 1, 1)]
res = heapsort(x)
print(res) # -> [(2, 1, 0), (3, 0, 0), (3, 1, 1), (6, 0, 1)]
如您所见,(3, 0, 0)
将按预期出现在 (3, 1, 1)
之前。