Python设置字符串差异

时间:2019-05-23 08:36:15

标签: python string set set-difference

在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”。不从集合中减去?由于第二种情况与第四种情况之间的区别是点,因此我认为这是罪魁祸首。使用双引号给出相同的行为。

2 个答案:

答案 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'}