如何从值集中删除对象

时间:2019-01-27 05:36:57

标签: python python-3.x object

我有一组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 :(得分:3)

如果您告诉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)

答案 1 :(得分:0)

似乎没有将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)