在Python中实现一组集合

时间:2014-07-24 06:28:35

标签: python class inheritance

检查一下,请告诉我我能做些什么才能让它发挥作用。我在这里得到一个明显的错误,说明我在迭代它时无法更改集合。我认为我试图做的事情在这里很清楚,但我已经在这方面做了很长时间的努力并寻求指导。

class SetOfSets(set):
    def __init__(self,setofsets):
        """
        initialize with family of sets
        """
        set.__init__(self,list(setofsets))
    def remove(self,element):
        """
        remove all sets from set with element in it
        """
        for inset in self:
            if element in inset:
                self.remove(element)

2 个答案:

答案 0 :(得分:0)

要使用代码示例跟进我的评论,以下是如何从集合中删除包含2的所有元组,而不是在迭代时修改集合:

>>> s = set([(1, 2), (3, 4), (2, 3), (2, 5)])
>>> s
set([(1, 2), (2, 3), (2, 5), (3, 4)])
>>> to_remove = set(t for t in s if 2 in t)
>>> to_remove
set([(1, 2), (2, 5), (2, 3)])
>>> s.difference_update(to_remove)
>>> s
set([(3, 4)])

答案 1 :(得分:-1)

为什么您遇到问题,并在另一篇文章(click here for original post)中明确回答了解决方案:

  

Python的抱怨是因为内部集合对象是可变的,因此不可清除。解决方案是对内部集合使用frozenset,以表示您无意修改它们。

也就是说,您可以拥有一组集,但不能修改内集。因此,它无法实现您想要的目标。

- 也就是说,Python集需要是可以清除的,因为它希望支持O(1)查找。如果这不是您的集合数据结构的要求,那么我将使用集合列表来模仿集合。但缺点是在修改内部集合之前,或者在内部集合中添加之前,您必须遍历整个列表以检查修改/添加是否会使列表中的两个集合成为冗余。这需要O(M)时间,其中M是列表中所有元素的数量。这太过分了。