我正在使用heapq
模块来确定列表中的最小项目。
我有以下代码,但heapq.heapify()
返回值为无。
如何在新列表中获得结果?
>>> a=heapq.heapify(lista)
>>> a
>>> lista=[1,2,3,4,5]
>>> a=heapq.heapify(lista)
>>> print(a)
None
答案 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
实现,该实现从输入堆创建新堆,仅固定数量最小的值。