请解释"设置差异"在python中

时间:2014-11-29 16:24:50

标签: python set

尝试学习Python我遇到了以下内容:

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

为什么是set(['p', 's']) - 我的意思是:为什么'h'会丢失?

5 个答案:

答案 0 :(得分:3)

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

您可能正在寻找symmetric_difference^方法:

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

此运算符 可交换。

答案 1 :(得分:2)

因为那是一组差异的定义。用简单的英语,它相当于" 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 :(得分:2)

有两种不同的operators

  • 设置差异。这被定义为A中不存在的A元素,并写为A - BA.difference(B)
  • 对称设置差异。这被定义为另一组中不存在的任何一个元素的元素,并写为A ^ B或{{1 }}。

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

使用|创建联盟,使用&创建交集,然后执行设置差异,即之间的差异所有元素常见元素