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()所做的事情,但我没有一个变量可用作参数,所以我需要一个替代方案.
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)