我有一个问题,我的设置在迭代期间改变了大小。如果它们满足谓词 p 的条件,我想从集合中删除项目,但是当我从集合中删除它时,它会停止迭代。如何在不停止迭代的情况下从集合中删除项目?
这是我目前的代码......
# A Black_Hole is a Simulton; it updates by removing
# any Prey whose center is contained within its radius
# (returning a set of all eaten simultons), and
# displays as a black circle with a radius of 10
# (width/height 20).
# Calling get_dimension for the width/height (for
# containment and displaying) will facilitate
# inheritance in Pulsator and Hunter
from simulton import Simulton
from prey import Prey
class Black_Hole(Simulton):
def __init__(self, posX, posY, width, height, radius):
Simulton.__init__(self, posX, posY, width, height);
self.radius = radius;
def contains(self, obj: Prey):
ox, oy = obj.get_location();
x, y = self.get_location();
finX = x - ox;
finY = y - oy;
return abs(finX) <= self.radius and \
abs(finY) <= self.radius and type(obj) not in [Black_Hole];
def display(self, board):
x, y = self.get_location();
board.create_oval(x - self.radius, y - self.radius,
x + self.radius, y + self.radius,
fill = 'black');
def update(self, model):
for obj in model.find(self.contains):
model.remove(obj);
问题在于更新功能。它访问另一个类的函数并传递谓词。谓词返回一组返回true的值。我想从集合中删除这些值,以便在GUI上更新它们。
答案 0 :(得分:1)
您可以创建model.find()
结果的副本:
for obj in set(model.find(self.contains)):
model.remove(obj)
可能有更有效的方法来执行您想要的操作,但您没有发布有关实现model
的类的足够详细信息。
答案 1 :(得分:0)
我明白了(:我刚刚提到了一个副本,然后从中删除了一些项目,然后将原始设置设置为新的。