Я не могу понять, почему мой код ниже выдает ошибку.

Я пытаюсь построить список приоритетов на основе модуля heapq Python. Единственное отличие от базового примера модуля состоит в том, что вы хотите использовать его с пользовательскими объектами в нем, вместо простых (int, int) или (int, str) кортежей.

import heapq

class MyObject():

 def __init__(self,a=0,name='toto'):

     self.a = a
     self.name = name

if __name__ == '__main__':

 priority_list = []
 heapq.heappush(priority_list,(1,MyObject()))
 heapq.heappush(priority_list,(1,MyObject()))

Это ошибка, которую я имею:

heapq.heappush(priority_list,(1,MyObject()))

TypeError: '<' not supported between instances of 'MyObject' and 'MyObject'

Ошибка не возникает, если я использую другой ключ для вставки в кучу, но разве heapq не должен иметь дело с теми же ключами? Я не очень хорошо понимаю это поведение.

Большое спасибо

1
Rodolphe Lemasquerier 14 Мар 2018 в 14:53

2 ответа

Лучший ответ

Оператор < не определен для вашего класса. Таким образом, heapq не может определить приоритет.

ob1 = MyObject()
ob1 < ob1

Повышения

TypeError: unorderable types: MyObject() < MyObject()

Затем вы должны определить логические операторы. Дополнительную информацию см. В this.

class MyObject():
    def __init__(self,a=0,name='toto'):
        self.a = a
        self.name = name

    def __lt__(ob1, ob2):
        return ob1.a < ob2.a

ob1 = MyObject()
ob1 < ob1 # returns False
3
Pedro H. N. Vieira 14 Мар 2018 в 12:05

Куча обладает тем свойством, что самый маленький объект всегда находится сверху. Чтобы Python сохранил этот инвариант, он должен каким-то образом определить, какой объект меньше. Ваш класс MyObject не предоставляет этого.

Вы можете определить __gt__ или __lt__, чтобы включить это.

0
Daniel Roseman 14 Мар 2018 в 12:04