根据我对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()
方法可以是一个集合。
我将其解释为我可以传递一个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 "", 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])
>>>
我希望返回:
>>> a
set([0, 1, 2, 3, 4])
我知道我可以做到这一点a.difference(b)
返回一个新的集合;或者使用set.difference_update(other)
;或使用集合运算符a -= b
,它会就地修改集合。
那么这是文档中的一个bug吗?可以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])
发布于 2012-01-30 05:27:14
你已经回答了这个问题。它指的是集合的集合(实际上是包含frozensets的集合)。
The paragraph you are referring to开头为:
注意,将elem参数添加到__包含__()、remove()和discard()方法可以是一个集合。
这意味着b
在a.remove(b)
可以是一个集合,然后继续:
要支持搜索等效的冻结集,请执行以下操作,元素集在搜索过程中临时变异,然后恢复。在搜索过程中,不应读取或改变elem集,因为它没有有意义的值。
这意味着如果b
是一个集合,a.remove(b)
将扫描a
对于等同于b
并将其移除(或抛出KeyError
如果它不存在)。
发布于 2012-01-30 05:23:55
你不能set
%s,共set
%s在Python中作为set
是可变的。相反,您可以拥有set
%s,共frozenset
另一方面,您可以调用__contains__()
remove()
,以及discard()
使用set
..。请参阅此示例:
a = set([frozenset([2])])
set([2]) in a # you get True
a.remove(set([2])) # a is now empty
因此,对您的问题的答案是,文档指的是set
%s,共frozenset
s.
发布于 2012-01-30 05:28:39
我正在查看各种版本的python (mac版)的内置帮助。以下是结果。
python2.5
删除(...)
从集合中删除元素;它必须是成员。
如果元素不是成员,则引发KeyError。
python2.6
删除(...)
从集合中删除元素;它必须是成员。如果元素不是成员,则引发KeyError。
python2.7
删除(...)
从集合中删除元素;它必须是成员。如果元素不是成员,则引发KeyError。
您引用的文档,完整地说,实际上是这样说的:
注意,将elem参数添加到__contains__()
remove()
,以及discard()
方法可以是一个集合。为了支持搜索等价的frozenset,elem集在搜索期间临时变异,然后恢复。
这似乎是一个脚注,这表明参数可能是一个集合,但除非它在集合中找到匹配的冻结集合,否则它不会被删除。提到被修改的集合是为了使其可以被散列以查找匹配的冻结集合。
https://stackoverflow.com/questions/9056833
复制相似问题