[解決済み] カスタム比較述語によるヒープク
2022-03-03 18:28:12
質問
カスタムソート述語でヒープを構築しようとしています。そこに入る値は「ユーザー定義」タイプなので、私はそれらの組み込み比較述語を変更することはできません。
というような方法はないでしょうか。
h = heapq.heapify([...], key=my_lt_pred)
h = heapq.heappush(h, key=my_lt_pred)
もっといいのは、heapqの関数を自分のコンテナでラップして、述語を渡し続ける必要がないようにすることです。
どのように解決するのか?
によると heapqドキュメント ヒープの順序をカスタマイズする方法は、ヒープ上の各要素をタプルにし、最初のタプル要素は通常のPythonの比較を受け入れるものにすることです。
heapq モジュールの関数は(オブジェクト指向ではないので)少し面倒で、常にヒープオブジェクト(ヒープ化したリスト)を最初のパラメータとして明示的に渡さなければなりません。一石二鳥なのは、非常にシンプルなラッパークラスを作ることで、それを使って
key
関数を実行し、ヒープをオブジェクトとして提示します。
以下のクラスは内部リストを保持しており、各要素はタプルで、その最初のメンバはキーであり、要素挿入時に
key
パラメータは、ヒープのインスタンス化時に渡されます。
# -*- coding: utf-8 -*-
import heapq
class MyHeap(object):
def __init__(self, initial=None, key=lambda x:x):
self.key = key
self.index = 0
if initial:
self._data = [(key(item), i, item) for i, item in enumerate(initial)]
self.index = len(self._data)
heapq.heapify(self._data)
else:
self._data = []
def push(self, item):
heapq.heappush(self._data, (self.key(item), self.index, item))
self.index += 1
def pop(self):
return heapq.heappop(self._data)[2]
(余分な
self.index
の部分は、評価されたキー値がドローで、保存された値が直接比較できない場合の衝突を避けるためのものです - そうでなければ、heapq は TypeError で失敗します)
関連
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】numpy: true_divide で無効な値に遭遇
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] pipで特定のバージョンのパッケージをインストールする
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み] リスト内包型辞書の作成
-
[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?
-
[解決済み] カスタムオブジェクトのArrayListをプロパティでソートする
-
[解決済み] ディクショナリーで最大値を持つキーを取得する?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ピロウズ画像色処理の具体的な活用方法
-
opencvとpillowを用いた顔認証システム(デモあり)
-
python implement mysql add delete check change サンプルコード
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み】Django: ImproperlyConfigured: SECRET_KEY 設定は空であってはならない
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み】Flaskのテンプレートが見つからない【重複あり
-
[解決済み】ValueError: xとyは同じサイズでなければならない
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない