在python中寻找倒置的堆

时间:2012-09-10 17:22:14

标签: python heap overloading invert

我想要从时间序列中解决n个最大极端。 heapq适用于最大的

def nlargest(series, n):
    count = 0
    heap = []
    for e in series:
        if count < n:
            count+=1
            hp.heappush(heap, e)
        else:
            # keeps heap size fixed 
            hp.heappushpop(heap,e)  
    ''' note: heap[0] is smallest '''
    return heap

但是n最小的呢?请注意,我想要原始系列的子集,因此堆化和反转顺序将不起作用。我想要的是将比较运算符从gt重载到lt。不太熟悉python中的重载。

一个不太吸引人的选择(假设数值)将在插入之前否定该项,然后否定整个返回堆(返回列表或重新堆积否定列表)但这似乎是kludgy并且它不再适用于具有gt和lt的非数字。任何优雅的解决方案?

2 个答案:

答案 0 :(得分:3)

您可以通过将项目的优先级乘以-1来轻松“创建”倒置堆。

因此,只需告诉您nsmallest如何“反转”优先级,根据需要修改每个值:

def nsmallest(series, n, invert=lambda x: -1 * x):
    count = 0
    heap = []
    for e in series:
        if count < n:
            count += 1
            hp.heappush(heap, (invert(e), e))
        else:
            # keeps heap size fixed
            hp.heappushpop(heap, (invert(e), e))  
    # note: heap[0][1] is largest, remove inverted priorities
    return [h[1] for h in heap]

请注意,我们使用(invertedpriority, value)元组来保持堆倒置。

对于非数字,你必须简单地提供一个反转函数,将优先级颠倒过来,它只需要是一个简单的键,而不是可读的东西:

alphanumeric_invert = lambda x: [(ord(c) * -1) for c in x] 

答案 1 :(得分:0)

使用Python标准库中的heapq.nsmallest

heapq.nsmallest(n, iterable[, key])
     

返回包含n定义的数据集中iterable个最小元素的列表。相当于:sorted(iterable, key=key)[:n]