Python从集合中删除集合

时间:2012-01-29 21:10:35

标签: python set

根据我对Built-In Types 5.7 Set Types的Python 2.7.2文档的解释,应该可以通过将A传递给set.remove(elem)set.discard(elem)来从集合B中删除集合A的元素/ p>

来自2.7.2的文档:

  

注意,__contains__()remove()discard()的elem参数   方法可以是一套。

我将此解释为表示我可以将set传递给remove(elem)discard(elem),并且所有这些元素都将从目标集中删除。我会用它来做一些奇怪的事情,比如从字符串中移除所有元音或remove all common words from a word-frequency histogram。这是测试代码:

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);或者使用集合运算符a -= b,它们就地修改集合。

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

这还不够清楚吗?

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

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

这是我原本想要的。

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

>>> a={0,1,2,3}
>>> b={2,3,4,5}
>>> a-b
set([0, 1])
>>> b-a
set([4, 5])

5 个答案:

答案 0 :(得分:18)

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

The paragraph you are referring to以:

开头
  

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

表示b中的a.remove(b)可以是一个集合,然后继续:

  

为了支持搜索等效的冻结集,在搜索过程中,elem集会暂时变异,然后恢复。在搜索过程中,不应读取或改变elem集,因为它没有有意义的值。

表示如果b是一个集合,a.remove(b)将扫描a以获取相当于b的冻结集并删除它(或抛出KeyError如果它不存在的话。)

答案 1 :(得分:13)

set1-set2

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

set1-set2
# {0, 1}
set2-set1
# {4, 5}

答案 2 :(得分:8)

由于set的{​​{1}}是可变的,因此您不能在set中使用set s set。相反,您可以拥有frozenset__contains__()个。另一方面,您可以使用remove()来呼叫discard()seta = set([frozenset([2])]) set([2]) in a # you get True a.remove(set([2])) # a is now empty 。见这个例子:

set

因此,您的问题的答案是文档指的是frozenset的{​​{1}}。

答案 3 :(得分:2)

我正在查看各种版本的python(对于mac)的内置帮助。结果如下。

  • 的python2.5
  

删除(...)
      从集合中删除元素;它必须是会员。
      如果元素不是成员,则引发KeyError。

  • python2.6的
  

删除(...)
      从集合中删除元素;它必须是会员。       如果元素不是成员,则引发KeyError。

  • python2.7
  

删除(...)
      从集合中删除元素;它必须是会员。       如果元素不是成员,则引发KeyError。

您完全引用的文档实际上是:

  

注意,__contains__()remove()discard()方法的elem参数可能是一组。为了支持搜索等效的冻结集,elem集在搜索期间暂时发生变异,然后恢复。

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

答案 4 :(得分:1)

我认为文档是指(冻结)集合,是的。