尝试学习Python我遇到了以下内容:
>>> set('spam') - set('ham')
set(['p', 's'])
为什么是set(['p', 's'])
- 我的意思是:为什么'h'
会丢失?
答案 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 - B
或A.difference(B)
。A ^ B
或{{1 }}。你的代码正在使用前者,而你似乎期待后者。
答案 3 :(得分:1)
设置差异是第一组中不在第二组中的所有字符的集合。 'p'和's'出现在第一组中但不出现在第二组中,因此它们处于组合差异中。 'h'没有出现在第一组中,因此它不在设定差异中(无论它是否在第一组中)。
答案 4 :(得分:1)
您还可以获得所需的结果:
>>> (set('spam') | set('ham')) - (set('spam') & set('ham'))
set(['p', 's', 'h'])
使用|
创建联盟,使用&
创建交集,然后执行设置差异,即之间的差异所有元素和常见元素。