我有两个类,并且已经向对象ve
添加了一些项目,但是如果id
匹配并删除了不匹配的对象,则需要更改这些项目。
class Env:
def __init__(self):
self.ve = []
def add_new_ve(self, start_position, start_di, vel,id):
self.ve.append(V(start_position, start_di, vel,id))
self.ve.remove(id)
class V:
def __init__(self,start_position, start_di, vel,id):
self.id=id
self.position = start_position
self.direction = start_di
self.velocity = vel
但是我遇到了这个错误
self.ve.remove(id)
ValueError: list.remove(x): x not in list
答案 0 :(得分:2)
您需要将V
对象传递给self.ve.remove()
,而不是id
-请注意,self.ve
是V
对象的列表,而不是列表的id
个。没有对象的情况下创建新列表会更简单(所有具有相同id
的对象都将被删除):
def add_new_ve(self, start_position, start_di, vel, id):
# remove old objects with the same id
self.ve = [x for x in self.ve if x.id != id]
# add new object with that id
self.ve.append(V(start_position, start_di, vel, id))
另一种选择是实现一个find()
方法,该方法返回给定V
的{{1}}对象,并且 是您可以传递给{ {1}},前提是您还要在id
中实现remove()
和__hash__
。如我所说,我的第一个解决方案比较简单。
答案 1 :(得分:1)
list.remove
方法查找匹配的项目,您可以使用@ÓscarLópez提供的方法,也可以使之等于V,例如
class V:
def __init__(self, start_position, start_di, vel,id):
self.id=id
self.position = start_position
self.direction = start_di
self.velocity = vel
def __eq__(self, other):
return self.id == other
list.remove
现在将删除匹配的 first 项。尽管这里是 gotcha ,但只有匹配的第一个实例将被删除。 list.remove
很懒,并停留在第一个匹配值。
因此,简而言之,奥斯卡的解决方案可能会更好。
答案 2 :(得分:0)
对于您来说,remove()
所需的参数是您要删除的特定元素。在这里,要传递的参数是id
,而不是列表的元素。您也可以改为这样的代码:
element = V(start_position, start_di, vel,id)
self.ve.append(element)
self.ve.remove(element)