2017-01-30 17 views
2

オブジェクトがヒープ内にあるかどうかを確認しようとしています。しかし、私はこのエラーを取得しておいてください。オブジェクトがヒープ内部にあるかどうかを調べる

AttributeError: 'tuple' object has no attribute 'X' 

私はHeapとこのようになりCellクラスがあります:私はHeapクラスを使用

class Cell(object): 
    def __init__(self, x, y): 
     self.X = x 
     self.Y = y 

    def __eq__(self, other): 
     return int(self.X) == int(other.X) and int(self.Y) == int(other.Y) 

import heapq 

class Heap(object): 
    def __init__(self): 
     self.heap = [] 

    def push(self, priority, cell): 
     heapq.heappush(self.heap, (priority, cell)) 

    def pop(self): 
     cell = heapq.heappop(self.heap)[1] 
     return cell 

    def contains(self, cell): 
     if(cell in self.heap): 
      return True 
     return False 

    def isEmpty(self): 
     return len(self.heap) == 0 

セルクラスをこのように:containsメソッドを使用するとエラーが発生します。

from Heap import Heap 
from Cell import Cell 

class Test(object): 
    def __init__(self): 
     self.myHeap = Heap() 
     cell = Cell(2, 3) 

     self.myHeap.push(1, cell) 

     if self.myHeap.contains(cell) == False: 
      print("not in heap") 

test = Test() 

私は間違っていますか?どんな助けもありがとう。

+0

'self.myHeap'は、上記の' Heap'クラスの 'Heap'オブジェクトです。より明確にするためのコードを追加しました。 –

+0

'List'で' priority'と 'Object Cell'を押していますか?ちょうどリストの 'Cell'をプッシュし、' self.myHeap'は何ですか? 'self'を削除して、あなたが何を持っているのか教えてください。 –

+0

あなたは自己を定義しました。コードを編集していませんでした。 –

答えて

1

問題はcontainsメソッドにあります。

​​

self.headタイプ(priority, Cell)のタプルのリストです。実際にCellsとこのリスト(タプル)の要素を比較すると、Cell.__eq__()メソッドが呼び出され、例外が発生します。

+0

'(priority、Cell).__ eq __()'を実行しようとしていますか?セルがそこに含まれているかどうかを確認する方法はありますか?私は 'Cell'で持っている' X'と 'Y'値としか比較できません。私が訊いていることは、 'Cell'オブジェクトを' __eq __() 'メソッドのタプルから得る方法がありますか? –

+1

はい、それは効果的な方法ではありません。 [heap queue theory](https://docs.python.org/2/library/heapq.html#theory)をよく読んでください。とにかくあなたがすることができるのは、 '' x [1]のセルがself.heapのxの場合、... 'です。 –

+0

ありがとうございます!私は再びヒープキューの理論を説明します。 –

関連する問題