Python 设置字符串的差异

Python set difference of strings

我在 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.'没有从集合中减去?由于第二种情况和第四种情况之间的区别是点,我认为这是罪魁祸首。使用双引号会产生相同的行为。

您的最后一组被解释为 {'a', '.'}。所以你的set操作不会排除'a.'

因为set会遍历输入,而string的遍历是char

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) . set - other - ...
Return a new set with elements in the set that are not in the 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'}