0

時系列から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でのオーバーロードについてはあまり詳しくありません。

あまり魅力的でないオプションは(数値を想定して)挿入する前にアイテムを否定し、次にリターンヒープ全体を否定することです(リストを返すか、否定されたリストを再ヒープします)が、これは厄介なようで、非数値では機能しなくなりますgtとltがあります。エレガントなソリューションはありますか?

4

2 に答える 2

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] 

ただし、独自に作成するのではなく、最適化された最大ヒープ実装を使用するheapq.nsmallest()関数(使用する内部_heappop_max()関数があります)を使用する必要があります。この関数は、ソートを安定させるためにタイブレーカーのカウント値も追加します。そして、マッチングheapq.nlargest()関数があります。

于 2012-09-10T17:24:03.833 に答える
0

heapq.nsmallestPython標準ライブラリから使用します。

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

nで定義されたデータセットから最小の要素を含むリストを返しiterableます。に相当:sorted(iterable, key=key)[:n]

于 2013-02-27T16:42:11.690 に答える