我想要从时间序列中解决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的非数字。任何优雅的解决方案?
答案 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]