在Python中创建不同的字符串集时,我遇到以下特殊行为:
set(['a', 'b']) - set(['a']) # results in {'b'} as expected
set(['a', 'b']) - set('a') # results in {'b'} as expected
set(['a.', 'b']) - set(['a.']) # results in {'b'} as expected
set(['a.', 'b']) - set('a.') # surprisingly results in {'a.', 'b'}!
为什么在最后一种情况下是“ a”。不从集合中减去?由于第二种情况与第四种情况之间的区别是点,因此我认为这是罪魁祸首。使用双引号给出相同的行为。
答案 0 :(得分:7)
您的最后一组被解释为{'a', '.'}
。因此,您的设置操作不会排除'a.'
这是因为set会迭代输入,而字符串的迭代是通过char进行的。
答案 1 :(得分:3)
set('a.')
将字符串解释为字符列表['a','.]
,结果为{'.', 'a'}
set(['a.', 'b'])
将该列表解释为['a.', 'b']
,结果为{'a.', 'b'}
现在,当您使用集合差异时,由于第一和第二集合的集合差异是第一集合本身,因此结果为{'a.', 'b'}
,因为这两个集合中没有公共元素。
从文档中:https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset
difference(* others)。设置-其他-...
返回一个新集合,该集合中的元素不在其他集合中。
下面可以更清楚地看到行为
In [1]: set('a.')
Out[1]: {'.', 'a'}
In [2]: set(['a.', 'b'])
Out[2]: {'a.', 'b'}
In [3]: set(['a.', 'b']) - set('a.')
Out[3]: {'a.', 'b'}