尝试学习Python时遇到以下情况:
>>> set('spam') - set('ham')
set(['p', 's'])
为什么是
set(['p', 's'])
- 我的意思是:为什么'h'
不见了?
Python 集合上的
-
运算符映射到 difference
方法,该方法被定义为集合 A
的成员,但不是集合 B
的成员。 因此,在这种情况下,不在 "spam"
中的 "ham"
成员是 "s"
和 "p"
。 请注意,此方法不可交换(即 a - b == b - a
并不总是为真)。
您可能正在寻找
symmetric_difference
或 ^
方法:
>>> set("spam") ^ set("ham")
{'h', 'p', 's'}
这个运算符是可交换的。
因为这是集合差异的定义。用简单的英语来说,它相当于“A 中存在哪些 B 中不存在的元素?”。
注意相反的行为使这一点更加明显
>>> set('spam') - set('ham')
{'s', 'p'}
>>> set('ham') - set('spam')
{'h'}
要获取所有独特元素,无论您询问的顺序如何,您都可以使用
symmetric_difference
>>> set('spam').symmetric_difference(set('ham'))
{'s', 'h', 'p'}
有两个不同的运算符:
A - B
或A.difference(B)
。A ^ B
或A.symmetric_difference(B)
。您的代码正在使用前者,而您似乎期望后者。
集合差是第一组中不属于第二组的所有字符的集合。 'p' 和 's' 出现在第一个集合中,但没有出现在第二个集合中,因此它们位于集合差异中。 'h'没有出现在第一组中,所以它不在组差中(无论是否在第一组中)。
您还可以获得所需的结果:
>>> (set('spam') | set('ham')) - (set('spam') & set('ham'))
set(['p', 's', 'h'])
使用|
创建
并集,使用
&
创建交集,然后进行设置差异,即所有元素和公共元素之间的差异。