首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python从set中移除set

Python从set中移除set
EN

Stack Overflow用户
提问于 2012-01-30 05:10:35
回答 4查看 79.9K关注 0票数 87

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

来自2.7.2的文档:

注意,将elem参数添加到__contains__()

remove(),以及discard()方法可以是一个集合。

我将其解释为我可以传递一个setremove(elem)或者discard(elem)

所有这些元素都将从目标集合中删除。我会用它来做一些奇怪的事情,比如移除字符串中的所有元音,或者remove all common words from a word-frequency histogram..。下面是测试代码:

代码语言:javascript
运行
复制
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 "", line 1, in 
KeyError: set([8, 9, 5, 6, 7])
>>> a.discard(b)
>>> a
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>

我希望返回:

代码语言:javascript
运行
复制
>>> a
set([0, 1, 2, 3, 4])

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

那么这是文档中的一个bug吗?可以set.remove(elem)

实际上不把集合作为参数?或者文档指的是集合的集合?鉴于此difference_update完成我的解释,我猜情况是后者。

这还不够清楚吗?

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

代码语言:javascript
运行
复制
>>> c = a.difference(b)
set([0,1,2,3,4])

这就是我最初想要得到的。

编辑之后再过4年python开发的.我意识到这个操作可以更清晰地表示,使用设置的文字和-运算符;证明集合差是非对易的,这是更完整的。

代码语言:javascript
运行
复制
>>> a={0,1,2,3}
>>> b={2,3,4,5}
>>> a-b
set([0, 1])
>>> b-a
set([4, 5])
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-30 05:27:14

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

The paragraph you are referring to开头为:

注意,将elem参数添加到__包含__()、remove()和discard()方法可以是一个集合。

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

要支持搜索等效的冻结集,请执行以下操作,元素集在搜索过程中临时变异,然后恢复。在搜索过程中,不应读取或改变elem集,因为它没有有意义的值。

这意味着如果b是一个集合,a.remove(b)

将扫描a对于等同于b并将其移除(或抛出KeyError如果它不存在)。

票数 28
EN

Stack Overflow用户

发布于 2012-01-30 05:23:55

你不能set%s,共set%s在Python中作为set

是可变的。相反,您可以拥有set%s,共frozenset

另一方面,您可以调用__contains__()

remove(),以及discard()使用set..。请参阅此示例:

代码语言:javascript
运行
复制
a = set([frozenset([2])])
set([2]) in a       # you get True
a.remove(set([2]))  # a is now empty

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

票数 9
EN

Stack Overflow用户

发布于 2012-01-30 05:28:39

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

python2.5

删除(...)

从集合中删除元素;它必须是成员。

如果元素不是成员,则引发KeyError。

python2.6

删除(...)

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

python2.7

删除(...)

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

您引用的文档,完整地说,实际上是这样说的:

注意,将elem参数添加到__contains__()

remove(),以及discard()

方法可以是一个集合。为了支持搜索等价的frozenset,elem集在搜索期间临时变异,然后恢复。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9056833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档