检查对象是否在集合中(Python)

时间:2020-03-29 23:32:52

标签: python set

假设我具有以下Point Class。

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 main():
  mySet = set()
  a = POINT(1,2)
  mySet.add(a)
  b = POINT(1,2)

  print("B is in mySet= {}".format(b in mySet))

我想知道一种检查对象(点)是否在集合中的有效方法。

我知道两种方法来实现它,但是它们要么效率不高,要么不使用自定义对象:

  1. 遍历集合中的所有点对象-> O(n)
  2. 使用集合表示点。即(mySet中的(1,2)->不使用自定义对象

我相信在使用关键字in时,它将检查对象的ID或哈希值。我想知道哪个关键术语可以让我检查集中的对象的值。

1 个答案:

答案 0 :(得分:0)

我们可以将这个问题改写为“如何对自定义对象使用in关键术语?”

我们需要在自定义类中定义哈希。我们该怎么做?

我们需要考虑两种主要情况:

  1. 避免碰撞
  2. 高效

如果我们定义hash = self.x + self.y,则可能会发生冲突,因为Point(x,y)和Point(y,x)会给出相同的哈希值,并且不应该是哈希值,因为它们的x和y不同。

避免这种情况的一种方法是使用内置对象的哈希函数。我们可以将self.xself.y转换为元组对象,以便它可以与哈希函数一起使用。其效率取决于Python如何实现hash()。

class POINT: 

def __hash__(self):
    return hash((self.x, self.y)) 
相关问题