根据我对Python 2.7.2文档Built-In Types 5.7 Set Types的解释,应该可以通过将A传递给set.remove(elem)
或set.discard(elem)
来从集合B中删除集合A的元素
从2.7.2的文档中:
Note, the elem argument to the
__contains__()
,remove()
, anddiscard()
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
。
那么这是文档中的一个bug吗?set.remove(elem)
是否可以不将集合作为参数?或者文档是指集合的集合吗?鉴于difference_update
完成了我的解释,我想情况是后者。
这还不够清楚吗?
编辑 经过3年额外的(一些专业的)python工作,最近又回到了这个问题上,我意识到现在我真正想要做的事情可以通过以下方法来完成:
>>> c = a.difference(b)
set([0,1,2,3,4])
这就是我最初想要得到的。
编辑
经过4年多的python开发。。。我意识到使用set literals和-
运算符可以更清楚地表示这个操作;而且更完整地说明了set difference是非交换的。
>>> a={0,1,2,3}
>>> b={2,3,4,5}
>>> a-b
set([0, 1])
>>> b-a
set([4, 5])
你已经回答了这个问题。它指集合的集合(实际上包含冻结集合的集合)。
The paragraph you are referring to开始于:
这意味着
a.remove(b)
中的b
可以是一个集合,然后继续:这意味着,如果
b
是一个集合,a.remove(b)
将扫描a
以查找与b
等价的冻结集并将其删除(如果不存在,则抛出KeyError
)。在Python中不能有
set
s的set
s,因为set
是可变的。相反,您可以使用set
s的frozenset
s。另一方面,您可以使用__contains__()
、remove()
和discard()
调用set
。请参见以下示例:因此,您的问题的答案是文档是指
frozenset
s的set
s我正在查看各种版本的python(用于mac)的内置帮助。这是结果。
你提到的全部文件实际上都说:
这似乎是一个脚注,表明参数可能是一个集合,但除非它在集合内找到匹配的冻结集合,否则它不会被删除。关于正在修改的集合的说明是,可以对其进行散列以查找匹配的冻结集合。
相关问题 更多 >
编程相关推荐