Я не могу понять, почему мой код ниже выдает ошибку.
Я пытаюсь построить список приоритетов на основе модуля 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 не должен иметь дело с теми же ключами? Я не очень хорошо понимаю это поведение.
Большое спасибо
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
Куча обладает тем свойством, что самый маленький объект всегда находится сверху. Чтобы Python сохранил этот инвариант, он должен каким-то образом определить, какой объект меньше. Ваш класс MyObject не предоставляет этого.
Вы можете определить __gt__
или __lt__
, чтобы включить это.
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.