集合差异与集合减法

121

-.difference() 在集合中有什么区别?语法显然不同,一个是二元运算符,另一个是实例方法。还有什么其他的区别吗?

s1 = set([1,2,3])
s2 = set([3,4,5])

>>> s1 - s2
set([1, 2])
>>> s1.difference(s2)
set([1, 2])

7
你有没有阅读文档 - BrenBarn
7
据@BrenBarn所说,这份文档组织得很混乱,如果不仔细阅读很容易漏掉一些内容。 - Abhijit
87
另一个“罪恶地关闭”的问题。@BrenBarn,StackOverflow就是文档。 - Bob Stein
3个回答

142
set.differenceset.union等函数可以以任何可迭代对象作为第二个参数,但是如果要使用-的话,则两个参数都需要是集合,而且输出结果没有区别。
Operation         Equivalent   Result
s.difference(t)   s - t        new set with elements in s but not in t

使用 .difference,您可以执行以下操作:
s1 = set([1,2,3])

print(s1.difference(*[[3],[4],[5]]))

{1, 2}

使用*(iterable, iterable)语法创建集合时,也更加高效,因为不会创建中间集合。您可以在这里看到一些比较:这里


1
我猜下一个问题是...为什么? 为什么集合减法没有定义成集合差? - user48956
2
@user48956 set_a - set_b 是由魔术方法(或dunder)__sub__定义的,等同于set_a.__sub__(set_b)。 因此,差异运算符取决于最左侧对象的类。 从那里开始,所有实现细节都是有关于像@Abhijit答案中那样的晦涩的东西。 - Vessel

25

乍一看,从文档中可能不太明显,但是埋藏在一个段落深处,它专门用于区分方法调用和运算符版本:

请注意,union()、intersection()、difference()、symmetric_difference()、issubset() 和 issuperset() 的非运算符版本方法将接受任何可迭代的参数。相比之下,它们基于运算符的对应物要求其参数是集合。这排除了容易出错的构造,如 set('abc') & 'cbs',更推荐使用可读性更强的 set('abc').intersection('cbs')


19

文档似乎表明差异可以采用多个集合,因此对于以下内容,可能更高效且更清晰:

s1 = set([1, 2, 3, 4])
s2 = set([2, 5])
s3 = set([3, 6])
s1.difference(s2, s3) # instead of s1 - s2 - s3

但我建议进行一些测试以验证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接