Skip to main content
 首页 » 编程设计

python之如果我不能使用它所附加的变量来找到它的索引,如何从列表中删除特定对象

2025年05月04日13lexus

我有这个创建 Ball 对象并将其附加到列表的函数:

list_of_balls = [] 
 
def create_new_ball(): 
    newball = Ball() 
    list_of_balls.append(newball) 

我需要能够从该列表中删除 Ball 的特定实例。我不知道该怎么做。我不能使用 list_of_balls.index() 因为所有实例都附加到私有(private)变量 newball。当我得到列表时,会返回类似这样的内容:

[<ma​​in.Foo instance at 0x22149c>, <ma​​in.Foo instance at 0x22111c>, <ma​​in.Foo instance at 0x2209b4 >, <ma​​in.Foo 实例在 0x22129c>]

所以我不知道如何瞄准特定实例。

有没有办法从该列表中删除 Ball 的特定实例?每个 Ball 实例都需要能够从列表中删除自己,但是实例如何知道它在列表中的身份和/或它的索引是什么?

编辑:我需要做的是在该列表(或字典或其他替代项)中识别它们。我知道如何从列表中删除项目,但我不知 Prop 体怎么做。

我想做 aList.remove() 所做的事情,但我没有变量用作参数,所以我需要一个替代方法。

请您参考如下方法:

list.remove 似乎工作正常:

>>> class Ball(object): pass 
...  
>>> balls = [ Ball() for _ in range(10) ] 
>>> balls 
[<__main__.Ball object at 0xe5350>, <__main__.Ball object at 0xe52b0>, <__main__.Ball object at 0xe5250>, <__main__.Ball object at 0xe5370>, <__main__.Ball object at 0xe5390>, <__main__.Ball object at 0xe53b0>, <__main__.Ball object at 0xe53d0>, <__main__.Ball object at 0xe5410>, <__main__.Ball object at 0xe5430>, <__main__.Ball object at 0xe5450>] 
>>> balls.remove(balls[4]) 
>>> balls 
[<__main__.Ball object at 0xe5350>, <__main__.Ball object at 0xe52b0>, <__main__.Ball object at 0xe5250>, <__main__.Ball object at 0xe5370>, <__main__.Ball object at 0xe53b0>, <__main__.Ball object at 0xe53d0>, <__main__.Ball object at 0xe5410>, <__main__.Ball object at 0xe5430>, <__main__.Ball object at 0xe5450>] 
>>> len(balls) 
9 

真正的问题是您如何知道要删除哪个 Ball?

根据评论,您似乎希望移除所有弹跳 N 次的球:

to_remove = [x for x in balls if x.times_bounced > N] 
for x in to_remove: 
    balls.remove(x) 

或者,如果您不需要就地执行此操作,您可以创建一个包含未反弹 N 次的球的新列表:

balls = [ x for x in balls if x.times_bounced <= N ] 

最后,如果需要,您可以使用这个习惯用法和切片赋值来完成整个事情:

balls[:] = [ x for x in balls if x.times_bounced <= N ]