Python从集合中删除集合


75

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

从2.7.2的文档中:

请注意__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])
>>>

我希望返回:

>>> 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开发...我意识到可以使用设置文字和-运算符更清楚地表示此操作;并且证明集差是非可交换的更完整。

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

c = a.difference(b)为我工作。谢谢!
gihanchanuka

Answers:


22

您已经回答了问题。它指的是集合集(实际上是包含冻结集合的集合)。

您所指的段落开头为:

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

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

为了支持搜索等效的Frozenset,在搜索过程中临时更改elem集,然后将其还原。在搜索过程中,不应读取或更改elem集,因为它没有有意义的值。

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


谢谢!鉴于我的误解,第二句话没有多大意义。选择此作为主要答案,因为它有助于消除我的主要误解。玲的例子也很有帮助。
cod3monk3y 2012年


8

在Python中,您不能使用set的,set因为它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

因此,对您的问题的答案是,文档引用set的是frozenset的。


对我来说,这是python文档中一个非常清晰的部分的非常简洁的说明。谢谢凌!
cod3monk3y 2012年

2

我正在查看各种版本的python(适用于mac)的内置帮助。这是结果。

  • python2.5

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

  • python2.6

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

  • python2.7

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

您所参考的全部文档实际上说的是:

请注意,该ELEM参数的__contains__()remove()discard()方法可能是一组。为了支持搜索等效的冻结集,在搜索过程中临时更改元素集,然后将其还原。

这似乎是一个脚注,表明该参数可能是一个集合,但是除非在该集合中找到匹配的冻结集合,否则它将不会被删除。关于要修改的集合的提及是,因此可以对其进行哈希处理以查找匹配的冻结集合。


1

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


2
但是你不能有一套。集不可散列。我想,您可能会有一个带有Frozenset作为元素的集合。
DSM 2012年

2
@DSM-因此,为什么文档elem在调用过程中提及要更改的值以查看是否存在等效值frozenset
2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.