本篇我们学习 Python 集合的对称差集(symmetric difference),它和差集是两个不同的概念。
集合的对称差集
两个集合的对称差集包含了两个集合中不属于两者交集的所有元素。以下是集合 s1 和 s2:
s1 = {'Python', 'Java', 'C++'}
s2 = {'C#', 'Java', 'C++'}
s1 和 s2 的对称差集返回结果如下:
{'C#', 'Python'}
从以上结果可以看出,所有元素属于 s1 或者 s2,同时又不属于它们的交集。
以下文氏图解释了集合 s1 和 s2 的对称差集:
在 Python 中,可以使用集合的 symmetric_difference() 方法或者对称差集操作符(^)获取两个或多个集合的对称差集。
symmetric_difference() 方法
集合的 symmetric_difference() 方法可以返回两个或多个集合的对称差集:
new_set = set1.symmetric_difference(set2, set3,...)
例如,以下示例返回了集合 s1 和 s2 的对称差集:
s1 = {'Python', 'Java', 'C++'}
s2 = {'C#', 'Java', 'C++'}
s = s1.symmetric_difference(s2)
print(s)
输出结果如下:
{'C#', 'Python'}
symmetric_difference() 方法返回了一个新的集合,不会修改原始集合。
对称差集操作符
查找对称差集的另一个方法就是使用对称差集操作符(^):
new_set = set1 ^ set2 ^...
以下示例同样返回了 s1 和 s2 的对称差集:
s1 = {'Python', 'Java', 'C++'}
s2 = {'C#', 'Java', 'C++'}
s = s1 ^ s2
print(s)
输出结果如下:
{'Python', 'C#'}
以下示例返回了多个集合的对称差集:
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s2 = {3, 4, 5}
s = s1 ^ s2 ^ s3
print(s)
输出结果如下:
```python
{1, 3, 5}
两种方法比较
symmetric_difference() 方法支持各种可遍历对象,例如字符串、列表、字典等。如果可遍历对象不是数组,该方法会将其转换为数组之后再返回它们的对称差集。
以下示例使用 symmetric_difference() 方法查找一个集合和一个列表的对称差集:
scores = {7, 8, 9}
ratings = [8, 9, 10]
new_set = scores.symmetric_difference(ratings)
print(new_set)
输出结果如下:
{10, 7}
另一方面,对称差集操作符只支持集合参数。如果我们使用非集合的可遍历对象作为参数,将会返回一个错误。例如:
scores = {7, 8, 9}
ratings = [8, 9, 10]
new_set = scores ^ ratings
print(new_set)
TypeError: unsupported operand type(s) for ^: 'set' and 'list'
总结
- 两个或多个集合的对称差集包含了属于任何集合、但不属于它们的交集的所有元素。
- 集合的 symmetric_difference() 方法以及对称差集操作符(^)都可以用于查找对称差集。