python是否在2.7.3中有内置的最小堆数据结构?
我不想导入代码。
我想要像
这样的东西myheap = minheap(key=lambda x: x[1])
myheap.add(obj)
o = myheap.pop()
这可能吗?
答案 0 :(得分:7)
就像每个人都说的那样,heapq
就是这样 - 但是,正如没人提到的那样,并不支持key=
!所以你需要回到key=
内部使用的好的旧DSU(decorate-sort-undecorate)习语,不管是heapq
还是nlargest
,除了函数{{ 1}}和nsmallest
并不与模块的其他部分有很大关系。)
所以你可以通过添加一个密钥来包装heapq
功能,例如在你自己的类中:
import heapq
class MyHeap(object):
def __init__(self, key, data=())
self.key = key
self.heap = [(self.key(d), d) for d in data]
heapq.heapify(self.heap)
def push(self, item):
decorated = self.key(item), item
heapq.heappush(self.heap, decorated)
def pop(self):
decorated = heapq.heappop(self.heap)
return decorated[1]
def pushpop(self, item):
decorated = self.key(item), item
dd = heapq.heappushpop(self.heap, decorated)
return dd[1]
def replace(self, item):
decorated = self.key(item), item
dd = heapq.heapreplace(self.heap, decorated)
return dd[1]
def __len__(self):
return len(self.heap)
有关pushpop
和replace
(以及标准库模块heapq
提供的其他辅助功能)之间的区别,请参阅https://docs.python.org/2/library/heapq.html。
答案 1 :(得分:1)
Python附带heapq,您不必下载,但仍需要导入。
Python几乎没有使用数据结构的方法,您可以在不使用import
语句的情况下使用它。您是否真的希望您的语言将其整个标准库加载到每个项目的内存和命名空间中?