Python从set中移除set

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

从2.7.2的文档:

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

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

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就地。

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

这不够明确吗?

编辑经过3年的额外(一些专业)python工作,并且最近回到这个问题,我意识到现在我实际上想要做的事情可以用下面的方法完成:

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

这正是我最初试图获得的。


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

您所指的段落开始于:

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

这意味着ba.remove(b)可以是一组,然后用继续:

为了支持搜索等效的冻结集 ,elem集在搜索过程中暂时发生变化,然后进行恢复。 在搜索期间,elem集不应该被读或者变异,因为它没有一个有意义的值。

这意味着如果b是一组, a.remove(b)将扫描a用于frozenset相当于b并将其取出(或抛出KeyError如果它不存在的话)。


您不能在Python中set s set ,因为set是可变的。 相反,你可以set一些frozenset set 。 另一方面,您可以使用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(for mac)的内置帮助。 结果如下。

  • 的python2.5
  • 去掉(...)
    从集合中移除一个元素; 它必须是一个成员。
    如果该元素不是成员,则引发KeyError。

  • python2.6的
  • 去掉(...)
    从集合中移除一个元素; 它必须是一个成员。 如果该元素不是成员,则引发KeyError。

  • python2.7
  • 去掉(...)
    从集合中移除一个元素; 它必须是一个成员。 如果该元素不是成员,则引发KeyError。

    你提到的文件完全是这样说的:

    请注意, __contains__()remove()discard()方法的elem参数可能是一个集合。 为了支持搜索等效的冻结集,elem集在搜索过程中暂时发生变化,然后进行恢复。

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

    链接地址: http://www.djcxy.com/p/53501.html

    上一篇: Python remove set from set

    下一篇: What is the time complexity of dict.keys() in Python?