2017-10-18 24 views
0

기본적으로 (키, 값) 쌍을 포함하는 힙을 생성하기 위해 heapq 모듈을 사용할 때 직선 값 대신 튜플을 사용할 수 있다는 것을 알고 있습니다.파이썬은 튜플을 사용할 때 heapq 비교를 오버라이드합니다.

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] 

더 큰 두 번째 값을 갖는 튜플은 두 개보다 작은 것으로 간주되어야합니다.

미리 감사드립니다.

편집 : 나는 오버로드와 오버라이드 사이의 용어를 혼란스럽게 생각합니다. 무시는 제가 언급 한 것입니다.

답변

1

예, 작동합니다. heapq과 함께 사용자 정의 클래스를 사용하기위한 전체 프로세스를 명확히하기 위해 여기에 asyncio으로 그립을 잡으려고 시도한 테스트 스크립트의 일부 추출 결과가 있습니다.

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

그런 다음이 순서가 가장 빠른 기다립니다 :

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을두고 : 다른 시간에 터질 타이머 추적하기 위해,이 클래스를 정의 대기 타이머가 해당 액션을 호출합니다.

try : 
    until = self.pending[0].when 
except IndexError : 
    # nothing more for event loop to do 
    break 
#end try 
now = time.time() 
if until > now : 
    time.sleep(until - now) 
#end if 
heapq.heappop(self.pending).action() 
+1

@Ellest 사용자 정의 클래스는 특정 오버로드 된 연산자를 구현하는 가장 단순하고 가장 Python적인 방법입니다. 'def __lt __ (self, other) :'전역 적으로 어떤 클래스에서든 연산자에 과부하가 걸리지 않으므로 아마 접근하지 못할 것입니다. 또한 내장형을 원숭이 패치하는 것은 불가능합니다. 따라서 문법적으로 올바르지 만 논리적으로 부정확하며 최상의 솔루션은 맞춤 클래스입니다. –