Python 从集合中移除集合

标签 python set

根据我对 Built-In Types 5.7 Set Types 的 Python 2.7.2 文档的解释,应该可以通过将 A 传递给 set.remove(elem)set.discard(elem)

从集合 B 中删除集合 A 的元素

来自 2.7.2 的文档:

Note, the elem argument to the __contains__(), remove(), and discard() methods may be a set.

我将此解释为意味着我可以将 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])

最佳答案

set1-set2

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

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

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

关于Python 从集合中移除集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9056833/

相关文章:

python pandas删除重复的列

python - 在Python中将 float 转换为十进制类型

python - 如何检查标签是否包含特定属性?

python - 属性始终为 None

python - python中的多个集合操作

python - 如何将训练后的 SVM 输出保存到文件中? (OpenCV/SimpleCV)

c++ - boost 哈纳 : create a map from a set and a default value

c++ - 比较列表/集合元素

arrays - 如何在 native Swift 中实现以前称为 NSMutableOrderedSet 的可变有序集泛型类型?

python-3.x - Python - 更新集合