heapq模块python

时间:2012-09-11 16:08:53

标签: python list priority-queue

我正在使用heapq模块来确定列表中的最小项目。

我有以下代码,但heapq.heapify()返回值为无。

如何在新列表中获得结果?

>>> a=heapq.heapify(lista)
>>> a
>>> lista=[1,2,3,4,5]
>>> a=heapq.heapify(lista)
>>> print(a)
None

1 个答案:

答案 0 :(得分:9)

heapq.heapify不会返回任何内容,它会将列表堆积到位;这样做效率要高得多:

>>> import heapq
>>> lista = [44, 42, 3, 89, 10]
>>> heapq.heapify(lista)
>>> lista
[3, 10, 44, 89, 42]

如果您需要列表,请创建一个副本:

>>> lista = [44, 42, 3, 89, 10]
>>> newlist = lista[:]
>>> heapq.heapify(newlist)
>>> lista
[44, 42, 3, 89, 10]
>>> newlist
[3, 10, 44, 89, 42]

当然,这有点失败了,因为复制列表也有(线性)成本。

如果你需要的只是列表中的最小项目,那么当找到一个最小的元素(heapify()和{{}时,min() function同样快 1}}扫描输入列表一次,因此O(n)成本):

min()

如果您需要多个最小值,请务必使用>>> min(lista) 3 ,尤其是稍后添加项目时。如果您无法更改原始列表,则需要几个最小的项目,请参阅looking for an inverted heap in python以获得有效heapq实现,该实现从输入堆创建新堆,固定数量最小的值。