根据我对Built-In Types 5.7 Set Types的Python 2.7.2文档的解释,应该可以通过将A传递给set.remove(elem)
或set.discard(elem)
来从集合B中删除集合A的元素/ p>
来自2.7.2的文档:
注意,
__contains__()
,remove()
和discard()
的elem参数 方法可以是一套。
我将此解释为表示我可以将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])
答案 0 :(得分:18)
你已经回答了这个问题。它指的是集合(实际上包含frozensets集合)。
The paragraph you are referring to以:
开头注意,__contains __(),remove()和discard()方法的elem参数可以是一个集合。
表示b
中的a.remove(b)
可以是一个集合,然后继续:
为了支持搜索等效的冻结集,在搜索过程中,elem集会暂时变异,然后恢复。在搜索过程中,不应读取或改变elem集,因为它没有有意义的值。
表示如果b
是一个集合,a.remove(b)
将扫描a
以获取相当于b
的冻结集并删除它(或抛出KeyError
如果它不存在的话。)
答案 1 :(得分:13)
set1-set2
set1={0,1,2,3}
set2={2,3,4,5}
set1-set2
# {0, 1}
set2-set1
# {4, 5}
答案 2 :(得分:8)
由于set
的{{1}}是可变的,因此您不能在set
中使用set
s set
。相反,您可以拥有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
因此,您的问题的答案是文档指的是frozenset
的{{1}}。
答案 3 :(得分:2)
我正在查看各种版本的python(对于mac)的内置帮助。结果如下。
删除(...)
从集合中删除元素;它必须是会员。
如果元素不是成员,则引发KeyError。
删除(...)
从集合中删除元素;它必须是会员。 如果元素不是成员,则引发KeyError。
删除(...)
从集合中删除元素;它必须是会员。 如果元素不是成员,则引发KeyError。
您完全引用的文档实际上是:
注意,
__contains__()
,remove()
和discard()
方法的elem参数可能是一组。为了支持搜索等效的冻结集,elem集在搜索期间暂时发生变异,然后恢复。
这似乎是一个脚注,表明参数可能是一个集合,但除非它在集合中找到匹配的冻结集,否则它不会被删除。关于被修改的集合的提及是这样的,它可以被散列以寻找匹配的冻结集。
答案 4 :(得分:1)
我认为文档是指(冻结)集合,是的。