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

Lyd*_*Lyd 1 python list object

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

list_of_balls = []

def create_new_ball():
    newball = Ball()
    list_of_balls.append(newball)
Run Code Online (Sandbox Code Playgroud)

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

[< 主要包含.foo实例在0x22149c>,< 主要在0x22111c包含.foo实例>,< 主要在0x2209b4包含.foo实例>,< 主要包含.foo在0x22129c实例>]

所以我不知道如何针对特定的实例.

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

编辑:我需要做的是在列表(或字典,或其他替代)上识别它们.我知道如何从列表中删除项目,我无法弄清楚具体是如何做到这一点.

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

mgi*_*son 5

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
Run Code Online (Sandbox Code Playgroud)

真正的问题是你怎么知道Ball要删除哪个?

根据评论,看起来你想要移除所有反弹N次的球:

to_remove = [x for x in balls if x.times_bounced > N]
for x in to_remove:
    balls.remove(x)
Run Code Online (Sandbox Code Playgroud)

或者,如果您不需要这样做,您可以创建一个新的列表,其中包含未反弹N次的球:

balls = [ x for x in balls if x.times_bounced <= N ]
Run Code Online (Sandbox Code Playgroud)

最后,如果您需要,可以使用此惯用法和切片分配来完成整个过程:

balls[:] = [ x for x in balls if x.times_bounced <= N ]
Run Code Online (Sandbox Code Playgroud)