-
和 .difference()
在集合中有什么区别?语法显然不同,一个是二元运算符,另一个是实例方法。还有什么其他的区别吗?
s1 = set([1,2,3])
s2 = set([3,4,5])
>>> s1 - s2
set([1, 2])
>>> s1.difference(s2)
set([1, 2])
-
和 .difference()
在集合中有什么区别?语法显然不同,一个是二元运算符,另一个是实例方法。还有什么其他的区别吗?
s1 = set([1,2,3])
s2 = set([3,4,5])
>>> s1 - s2
set([1, 2])
>>> s1.difference(s2)
set([1, 2])
set.difference
、set.union
等函数可以以任何可迭代对象作为第二个参数,但是如果要使用-
的话,则两个参数都需要是集合,而且输出结果没有区别。Operation Equivalent Result
s.difference(t) s - t new set with elements in s but not in t
s1 = set([1,2,3])
print(s1.difference(*[[3],[4],[5]]))
{1, 2}
使用*(iterable, iterable)
语法创建集合时,也更加高效,因为不会创建中间集合。您可以在这里看到一些比较:这里
set_a - set_b
是由魔术方法(或dunder)__sub__
定义的,等同于set_a.__sub__(set_b)
。 因此,差异运算符取决于最左侧对象的类。 从那里开始,所有实现细节都是有关于像@Abhijit答案中那样的晦涩的东西。 - Vessel乍一看,从文档中可能不太明显,但是埋藏在一个段落深处,它专门用于区分方法调用和运算符版本:
请注意,union()、intersection()、difference()、symmetric_difference()、issubset() 和 issuperset() 的非运算符版本方法将接受任何可迭代的参数。相比之下,它们基于运算符的对应物要求其参数是集合。这排除了容易出错的构造,如
set('abc') & 'cbs'
,更推荐使用可读性更强的set('abc').intersection('cbs')
。
文档似乎表明差异可以采用多个集合,因此对于以下内容,可能更高效且更清晰:
s1 = set([1, 2, 3, 4])
s2 = set([2, 5])
s3 = set([3, 6])
s1.difference(s2, s3) # instead of s1 - s2 - s3
但我建议进行一些测试以验证。