1

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

list_of_balls = []

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

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

[< main .Foo 实例在 0x22149c>,< main .Foo 实例在 0x22111c>,< main .Foo 实例在 0x2209b4>,< main .Foo 实例在 0x22129c>]

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

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

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

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

4

2 回答 2

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

真正的问题是您如何知道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 ]
于 2012-11-23T19:45:01.263 回答
3

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

需要对如何识别实例有所了解;在这种情况下,您可以简单地将其转移到实际的工作方式中。例如,给他们一个名字或一个 ID。然后,您可以使用字典或其他东西。默认情况下,实例只能通过它们的确切身份来识别。

每个 Ball 实例都需要能够从列表中删除自己

>>> class Ball ():
        pass
>>> list_of_balls = []
>>> def create_new_ball():
        list_of_balls.append(Ball())
>>> def remove_yourself(ball):
        list_of_balls.remove(ball)
>>> for i in range(10): create_new_ball()
>>> list_of_balls
[<__main__.Ball object at 0x0000000002EB5E48>, <__main__.Ball object at 0x0000000002EBD908>, <__main__.Ball object at 0x0000000002EBDEB8>, <__main__.Ball object at 0x0000000002EBDE80>, <__main__.Ball object at 0x0000000002EBD978>, <__main__.Ball object at 0x0000000002ED41D0>, <__main__.Ball object at 0x0000000002ED4208>, <__main__.Ball object at 0x0000000002ED4240>, <__main__.Ball object at 0x0000000002ED4278>, <__main__.Ball object at 0x0000000002ED42B0>]
>>> one_ball = list_of_balls[4] # random ball, chosen by fair dice roll
>>> one_ball in list_of_balls
True
>>> remove_yourself(one_ball)
>>> one_ball in list_of_balls
False
于 2012-11-23T19:47:48.203 回答