2017-01-30 2 views
2

Я пытаюсь проверить, находится ли объект внутри кучи. Тем не менее, я получаю эту ошибку:Проверка объекта внутри кучи

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

У меня есть Heap и Cell класс, который выглядит примерно так:

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 

Cell класс:

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) 

Я использую Heap класс вот так: я получаю ошибку, когда использую метод 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

вы нажимаете 'priority' и' Object Cell' в 'List' ?? Просто нажмите «Ячейка» в списке и что такое 'self.myHeap'? удалите 'self', тогда попробуйте и скажите мне, что у вас есть –

+0

ok вы определили себя, не видели, как вы отредактировали код –

ответ

1

Проблема в contains способ.

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

self.head список кортежей типа (priority, Cell). И вы на самом деле сравниваете Cells с элементами этого списка (кортежи), поэтому вызывается метод Cell.__eq__(), и он вызывает исключение.

+0

Итак, он пытается сделать '(priority, Cell) .__ eq __()'? Есть ли способ проверить, есть ли там ячейка? Я могу сравнить только с значениями 'X' и' Y', которые у меня есть в 'Cell'. В основном, что я спрашиваю, есть ли способ получить объект «Cell» из кортежа внутри метода '__eq __()'? –

+1

Да, но это не будет эффективным способом. Пожалуйста, прочитайте [теорию очереди кучи] (https://docs.python.org/2/library/heapq.html#theory) более тщательно. В любом случае, что вы можете сделать, это 'if cell in [x [1] для x в self.heap]: ...'. –

+0

Спасибо! Я снова рассмотрю теорию очереди кучи. –

Смежные вопросы