检查一下,请告诉我我能做些什么才能让它发挥作用。我在这里得到一个明显的错误,说明我在迭代它时无法更改集合。我认为我试图做的事情在这里很清楚,但我已经在这方面做了很长时间的努力并寻求指导。
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)
答案 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是列表中所有元素的数量。这太过分了。