【问题标题】:How do I delete a specific object from a list?如何从列表中删除特定对象?
【发布时间】:2020-09-12 18:02:56
【问题描述】:

我正在尝试在 python 中学习一些基本的列表理解,这是我正在搞砸的代码:

class myClass:
    def __init__(self,num):
        self.num = num

x = myClass(1)
y = myClass(2)
z = myClass(3)

obj = [x,y,z]

这里,我想从列表“obj”中删除一个self.num值为3的对象,我该怎么做? 还假设列表中的每个对象都有自己唯一的 self.num 值。

【问题讨论】:

  • obj = [o for o in obj if obj.num != 3]

标签: python list class


【解决方案1】:

您可以为您的班级实施__eq__。使用这种方法,您可以隐藏类的内部细节,并且将来可以更轻松地更改相等逻辑而不会破坏代码。

https://docs.python.org/3/reference/datamodel.html#object.__eq__

class myClass:
    def __init__(self,num):
        self.num = num
    def __eq__(self,other):
        if isinstance(other, self.__class__):
            return self.num == other.num
        else:
            return False
    def __repr__(self):
        return f'num: {self.num}'

x = myClass(1)
y = myClass(2)
z = myClass(3)

to_delete = myClass(3)

objs = [x,y,z]
filtered_objs = [obj for obj in objs if obj != to_delete]
print(filtered_objs)

输出

[num: 1, num: 2]

【讨论】:

    【解决方案2】:

    使用 Python 内置方法filter

    list(filter(lambda x:x.num!=3, obj))
    

    这比列表理解要快一点。

    【讨论】:

    • 整体答案很好(函数式编程),但实际上,list comprehension tends to be faster than filter。它会有所不同,但对于这种特殊情况,它在我的 PC 上的速度要快 2 倍。
    • 好的,伙计们,这是我之前知道的关于迭代器的新事物,但我错了。我为一个包含 1000 万个实例的列表计时,如果剩余列表很小,理解速度会快 50%,如果可移动项目很少,理解速度会快 30%。
    【解决方案3】:

    你可以简单地通过列表理解来做到这一点

    obj = [i for i in obj if i.num != 3]
    

    【讨论】:

      【解决方案4】:

      这可以通过多种方式实现,但一般算法将是:

      1. 找到这个对象
      2. 从列表中删除

      要查找对象,您需要执行某种循环,例如:

      for o in obj:
          if o.num == 3:
              index = obj.index(o)
      

      现在你有了对象的索引,你可以用obj.pop(index)删除它。

      另一种方法是列表推导:

      obj = [o for o in obj if o.num != 3]
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-23
      • 2018-07-11
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 2017-06-22
      相关资源
      最近更新 更多