Python从集合中删除集合

cod*_*k3y 62 python set

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

从2.7.2的文档:

请注意,该ELEM参数的__contains__(),remove()discard() 方法可能是一组.

我解释这意味着我可以通过一个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])
>>>
Run Code Online (Sandbox Code Playgroud)

我期望回归:

>>> a
set([0, 1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)

我知道我可以做到这一点,a.difference(b)并返回一个新的集合; 或者用set.difference_update(other); 或者使用集合运算符a -= b,它们就地修改集合.

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

这还不够清楚吗?

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

>>> c = a.difference(b)
set([0,1,2,3,4])
Run Code Online (Sandbox Code Playgroud)

这是我原本想要得到的.

编辑 经过4年多的python开发......我意识到使用set literals和-operator 可以更清晰地表达这个操作; 并且更完整地表明集合差异是非交换的.

>>> a={0,1,2,3}
>>> b={2,3,4,5}
>>> a-b
set([0, 1])
>>> b-a
set([4, 5])
Run Code Online (Sandbox Code Playgroud)

Nic*_*aro 35

set1-set2

set1={0,1,2,3}
set2={2,3,4,5}

set1-set2  # {0, 1}
set2-set1  # {4, 5}
Run Code Online (Sandbox Code Playgroud)

但是,请注意,无论出于何种原因,您都无法在 python 中设置“+”...

  • 终于有一个简单的答案了! (4认同)

nit*_*sas 20

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

您所指的段落以下列内容开头:

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

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

为了支持搜索等效的冻结集,elem集在搜索期间暂时发生变化,然后恢复.在搜索期间,不应读取或改变元素集,因为它没有有意义的值.

这意味着如果b是一个集合,a.remove(b)将扫描a等效的冻结集b并将其删除(KeyError如果它不存在则抛出一个).

  • 谢谢!鉴于我的误解,第二句话没有多大意义。选择此作为主要答案,因为它有助于澄清我的主要误解。Ling的例子也很有帮助。 (2认同)

Lin*_*ing 8

你不能有setsetS IN Python作为一门set是可变的.相反,你可以有setfrozenset秒.在另一方面,你可以打电话__contains__(),remove()discard()一个set.看这个例子:

a = set([frozenset([2])])
set([2]) in a       # you get True
a.remove(set([2]))  # a is now empty
Run Code Online (Sandbox Code Playgroud)

因此,您的问题的答案是文档指set的是frozensets.