Python从集合中删除集合

根据我对内置types5.7设置types的Python 2.7.2文档的解释,应该可以通过传递A给set.remove(elem)set.discard(elem)来从集合B中移除集合A的元素。

从2.7.2的文档:

请注意, __contains__()remove()discard()方法的elem参数可能是一个集合。

我认为这意味着我可以通过一个setremove(elem)discard(elem) ,所有这些元素将从目标集合中移除。 我会用这个来做一些奇怪的事情,比如从string中删除所有的元音,或者从字频组合中删除所有常见的单词 。 以下是testing代码:

 Python 2.7.2 (default, Jun 12 2011, 14:24:46) [M... Type "help", "copyright", "credits" or "license" >>> a = set(range(10)) >>> b = set(range(5,10)) >>> a set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> b set([8, 9, 5, 6, 7]) >>> a.remove(b) Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: set([8, 9, 5, 6, 7]) >>> a.discard(b) >>> a set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> 

我期望回报:

 >>> a set([0, 1, 2, 3, 4]) 

我知道我可以用a.difference(b)来完成这个工作,它返回一个新的集合。 或者用set.difference_update(other) ; 或者用set操作符a -= b来修改集合。

那么这是文档中的错误吗? set.remove(elem)实际上是不是以集合为参数? 或者文档是否涉及集合? 鉴于difference_update完成我的解释,我猜这个案例是后者。

这不够明确吗?

编辑经过3年的额外(一些专业)的Python工作,并最近被拉回到这个问题,我现在意识到我实际上正在试图做的事情可以完成:

 >>> c = a.difference(b) set([0,1,2,3,4]) 

这正是我最初想要得到的。

你已经回答了这个问题。 它指的是套集(实际上包含frozensets集)。

您所指的段落开始于:

请注意,__contains __(),remove()和discard()方法的elem参数可能是一个集合。

这意味着a.remove(b)中的a.remove(b)可以是一个集合,然后继续:

为了支持search等效的冷冻集 ,elem集在search过程中暂时被改变,然后被恢复。 在search过程中,elem集不应该被读取或者变异,因为它没有一个有意义的值。

这意味着如果b是一个集合, a.remove(b)将会扫描a相当于b的冷冻集合并将其移除(或者如果它不存在则抛出一个KeyError)。

你不能在Python中set s的set ,因为一个set是可变的。 相反,你可以set一个frozenset set 。 另一方面,你可以调用__contains__()remove()discard() 。 看到这个例子:

 a = set([frozenset([2])]) set([2]) in a # you get True a.remove(set([2])) # a is now empty 

所以你的问题的答案是文档是指setfrozenset

我正在寻找各种版本的Python(对于Mac)的内置帮助。 这是结果。

  • 的python2.5

去掉(…)
从集合中删除一个元素; 它必须是一个成员。
如果元素不是成员,则引发KeyError。

  • python2.6的

去掉(…)
从集合中删除一个元素; 它必须是一个成员。 如果元素不是成员,则引发KeyError。

  • python2.7

去掉(…)
从集合中删除一个元素; 它必须是一个成员。 如果元素不是成员,则引发KeyError。

你所提到的文件实际上是这样说的:

请注意, __contains__()remove()discard()方法的elem参数可能是一个集合。 为了支持search等效的冷冻集,elem集在search过程中暂时被改变,然后被恢复。

这似乎是一个脚注,表明这个论点可能是一个集合,但是除非在集合中find一个匹配的冻结集合,否则它不会被删除。 关于被修改的集合的提及是因为它可以被散列来查找一个匹配的冻结集合。

我认为这个文档是指(冷冻)集的集合,是的。