如何在python中删除和更改附加列表?

时间:2019-07-13 09:55:22

标签: python

我有两个类,并且已经向对象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

3 个答案:

答案 0 :(得分:2)

您需要将V对象传递给self.ve.remove(),而不是id-请注意,self.veV对象的列表,而不是列表的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)