Как удалить объект по значению из набора - PullRequest
0 голосов
/ 27 января 2019

У меня есть набор объектов Point, и я хотел бы иметь возможность удалить эти объекты из моего набора. Однако Python, похоже, сравнивает их по указателю, а не по значению, поэтому я не могу легко удалить элементы, поскольку они не имеют одинакового указателя, поскольку они не являются точно одинаковыми объектами. Это проблема только с объектами, а не с примитивами.

Упрощенный пример моей проблемы:

class Point():
    def __init__(self, x, y):
        self.x = x
        self.y = y

a = set()
a.add(Point(0, 0))
b = Point(0, 0)
a.remove(b)

При запуске возвращается

Traceback (most recent call last):
  File "example.py", line 9, in <module>
    a.remove(b)
KeyError: <__main__.Point object at 0x7f6292376128>

(очевидно, конкретный указатель меняется при каждом запуске).

Я бы предпочел удалить элемент (0, 0) из a, оставив a пустым множеством.

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Не похоже, что вы фактически добавили точку b к набору 'a'.Согласно документам:

Если элемент (аргумент), переданный методу remove (), не существует, генерируется исключение keyError.

Я сделал это незначительнымизменение, и это не ошибка

class Point():
    def __init__(self, x, y):
        self.x = x
        self.y = y

a = set()
a.add(Point(0, 0))
b = Point(0, 0)
a.add(b)
a.remove(b)
0 голосов
/ 27 января 2019

Если вы скажете Python, как сравнивать эти объекты, это может сработать. Добавьте два метода, например:

Код:

def __eq__(self, other):
    return self.x == other.x and self.y == other.y

def __hash__(self):
    return hash((self.x, self.y))

Тестовый код:

class Point():
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

    def __hash__(self):
        return hash((self.x, self.y))


a = set()
a.add(Point(0, 0))
b = Point(0, 0)
a.remove(b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...