在更新功能期间的迭代期间设置更改的大小

时间:2015-06-07 11:11:38

标签: python set

我有一个问题,我的设置在迭代期间改变了大小。如果它们满足谓词 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上更新它们。

2 个答案:

答案 0 :(得分:1)

您可以创建model.find()结果的副本:

for obj in set(model.find(self.contains)):
    model.remove(obj)

可能有更有效的方法来执行您想要的操作,但您没有发布有关实现model的类的足够详细信息。

答案 1 :(得分:0)

我明白了(:我刚刚提到了一个副本,然后从中删除了一些项目,然后将原始设置设置为新的。