请解释一下python中的“设置差异”

问题描述 投票:0回答:5

尝试学习Python时遇到以下情况:

>>> set('spam') - set('ham')
set(['p', 's'])

为什么是

set(['p', 's'])
- 我的意思是:为什么
'h'
不见了?

python set symmetric-difference
5个回答
8
投票

Python 集合上的

-
运算符映射到
difference
方法,该方法被定义为集合
A
的成员,但不是集合
B
的成员。 因此,在这种情况下,不在
"spam"
中的
"ham"
成员是
"s"
"p"
。 请注意,此方法不可交换(即
a - b == b - a
并不总是为真)。

您可能正在寻找

symmetric_difference
^
方法:

>>> set("spam") ^ set("ham")
{'h', 'p', 's'} 

这个运算符可交换的。


3
投票

因为这是集合差异的定义。用简单的英语来说,它相当于“A 中存在哪些 B 中不存在的元素?”。

注意相反的行为使这一点更加明显

>>> set('spam') - set('ham')
{'s', 'p'}

>>> set('ham') - set('spam')
{'h'}

要获取所有独特元素,无论您询问的顺序如何,您都可以使用

symmetric_difference

>>> set('spam').symmetric_difference(set('ham'))
{'s', 'h', 'p'}

2
投票

有两个不同的运算符

  • 设置差值。定义为A中不存在于B中的元素,写为
    A - B
    A.difference(B)
  • 对称集合差异。这被定义为任一集合中不存在于另一个集合中的元素,并写作
    A ^ B
    A.symmetric_difference(B)

您的代码正在使用前者,而您似乎期望后者。


1
投票

集合差是第一组中不属于第二组的所有字符的集合。 'p' 和 's' 出现在第一个集合中,但没有出现在第二个集合中,因此它们位于集合差异中。 'h'没有出现在第一组中,所以它不在组差中(无论是否在第一组中)。


1
投票

您还可以获得所需的结果:

>>> (set('spam') | set('ham')) - (set('spam') & set('ham'))
set(['p', 's', 'h'])

使用|创建

并集
,使用&创建
交集
,然后进行设置差异,即所有元素公共元素之间的差异。

© www.soinside.com 2019 - 2024. All rights reserved.