2017-10-18 8 views
0

ヒープを生成するためにheapqモジュールを使用する際に、真の値の代わりにタプルを使用できることを理解しています。タプルを使用する場合のPythonのヒープ比較のオーバーライド

また、heapqモジュールの比較演算子__lt__をオーバーライドして、ヒープの作成と保守で独自の比較を行うこともできます。

この演算子をオーバーライドしてタプルの両方の値を比較する方法はありますか?例えば、私は最初の線に沿って何かと等しい場合は、タプルの第二の値を比較heapq持ってしようとしています:

ロジックがあることであると後半 other[1] < self[1]は意図的に逆転され
def __lt__(self, other): 
    return self[0] < other[0] if self[0] != other[0] else other[1] < self[1] 

より大きな第2の値を有するタプルは、その2つのうち小さい方であると考えられるべきである。

事前の洞察に感謝します。

編集:私は、オーバーロードとオーバーライドの用語を混同していると思います。上書きは私が言及していたものでした。

答えて

1

はい、うまくいきます。 heapqでカスタムクラスを使用するための全体的なプロセスを明確にするために、私はasyncioでグリップを得るために書いたテストスクリプトのいくつかの抜粋を示します。異なる時間に消灯タイマーを追跡するために、私はこのクラスを定義した:

class TimerTask : 
    "actions to be invoked at specific times." 

    def __init__(self, when, action) : 
     self.when = when 
     self.action = action 
    #end __init__ 

    def __lt__(a, b) : 
     return \ 
      a.when < b.when 
    #end __lt__ 

#end TimerTask 

このような行が保留キューにTimerTaskを置く:

heapq.heappush(self.pending, self.TimerTask(when, trigger_sleep_done)) 

次に、このシーケンスが早いのを待ちその対応するアクションを呼び出す:

+1

@Ellestカスタムクラスは、特定のオーバーロードされた演算子を実装する最も単純で最もPythonの方法です。あなたは 'def __lt __(self、other):'はどのクラスの演算子にもグローバルにオーバーロードされないので、おそらく動作しません。また、組み込み型のパッチを作るのは不可能です。構文的には正しいものの、論理的に間違っており、最適な解決策はカスタムクラスです。 –

関連する問題