1

I have this function that creates a Ball object and appends it to a list:

list_of_balls = []

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

I need to be able to remove specific instances of Ball from that list. I have no idea how to do this. I cant use list_of_balls.index() because all the instances are attached to the private variable newball. When I get the list something like this is returned:

[<main.Foo instance at 0x22149c>, <main.Foo instance at 0x22111c>, <main.Foo instance at 0x2209b4>, <main.Foo instance at 0x22129c>]

So I have no idea of how to aim specific instances.

Is there a way to remove specific instances of Ball from that list? Each Ball instance needs to be able to remove itself from the list, but how do the instance knows who it is on the list and/or what is its index?

Edit: What I need to do is to identify them on that list (or dictionary, or other alternative). I know how to remove items from a list, what I can't figure out is how to do it specifically.

I want to do exactly what aList.remove() does, but I don't have a variable to use as argument, so I need an alternative.

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 を付けます。その後、辞書などを使用できます。デフォルトでは、インスタンスは正確な 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 に答える