我创建了一个名为point
的类,如下所示:
class point:
def __init__(self):
self.x = 0
self.y = 0
并创建point
个实例列表:
p1 = point()
p1.x = 1
p1.y = 1
p2 = point()
p2.x = 2
p2.y = 2
p_list = []
p_list.append(p1)
p_list.append(p2)
现在我想从列表中删除x = 1
和y = 1
的实例,我该怎么做?
我尝试为类__cmp__
添加point
方法,如下所示:
class point:
def __init__(self):
self.x = 0
self.y = 0
def __cmp__(self, p):
return self.x==p.x and self.y==p.y
但以下代码不起作用
r = point()
r.x = 1
r.y = 1
if r in p_list:
print('correct')
else:
print('wrong') # it will go here
p_list.remove(r) # it reports 'ValueError: list.remove(x): x not in list'
答案 0 :(得分:8)
您的__cmp__
功能不正确。 __cmp__
应返回-1/0/+1
,具体取决于第二个元素是小于/等于/大于self
。因此,当调用__cmp__
时,如果元素相等则返回True
,然后将其解释为1
,从而“大于”。如果元素不相等,则返回False
,即0
,其被解释为“相等”。
对于二维点,无论如何,“大于”和“小于”都没有明确定义,因此您可以使用相同的实现将__cmp__
替换为__eq__
。您的point
课程应为:
class point:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __eq__(self, p):
return self.x==p.x and self.y==p.y
答案 1 :(得分:0)
当您检查r
是否在p_list
中时,您创建了一个新的点实例,因此该点的实例将不在列表中(它在内存中具有不同的位置)。
此函数用于删除x和y为1的点:
for idx, p in enumerate(p_list):
if p.x==1 and p.y==1:
del p_list[idx]