Python字符串集差

Python字符串集差,python,string,set,set-difference,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.') # s

在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”?由于第二个和第四个案例的区别在于dot,我认为这就是罪魁祸首。使用双引号给出了相同的行为。

您的上一个集合被解释为{'a','.}。因此,您的set操作不会排除'a'


这是因为set将遍历输入,而字符串上的迭代是通过char进行的。

您的上一个set被解释为{'a','.}。因此,您的set操作不会排除'a'

这是因为set将遍历输入,而对字符串的迭代是按字符进行的。

set'a.'将字符串解释为字符列表['a','.],从而产生{'.','a'}

set['a.','b']将列表解释为['a.','b'],结果是{'a.','b'}

现在,当你取集合差分时,结果是{'a.','b'},因为第一个集合和第二个集合的集合差分是第一个集合本身,因为这两个集合中不存在公共元素

从文档中:

差异*其他。集合-其他-。。。 返回一个新集合,集合中的元素不在其他集合中

下面可以更清楚地看到这种行为

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'}
集合“a.”将字符串解释为字符列表[“a”,“a”。],结果为{“.”,“a'}

set['a.','b']将列表解释为['a.','b'],结果是{'a.','b'}

现在,当你取集合差分时,结果是{'a.','b'},因为第一个集合和第二个集合的集合差分是第一个集合本身,因为这两个集合中不存在公共元素

从文档中:

差异*其他。集合-其他-。。。 返回一个新集合,集合中的元素不在其他集合中

下面可以更清楚地看到这种行为

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

set'a.={'.','a'},所以我不确定我会称这种行为为惊奇,你看到set'a.是什么了吗?这是一个带有字符串'a'和''set'a.'={'.','a'}的集合,所以我不确定我会称之为令人惊讶的行为。你看到了集合'a'是什么吗?这是一个带有“a”和“and”字符串的集合。你能告诉我为什么它会被这样解释吗?来自Scala似乎有悖常理。@abc中x的bugfoot正在读取字符a、b、c。对于一个列表['abc'],它是不同的,因为只有一个项目。它将iterable的内容转换成一个集合。如果iterable是一个列表,那么它将从列表中的每个元素创建一个集合。这同样适用于字符串@Bugfoot,因此它不是点而是任何多字符字符串。。。相应地修改了标题。@bugfoot您可以打开一个REPL并键入set'abc'以帮助更好地理解。您能告诉我为什么它会被这样解释吗?来自Scala似乎有悖常理。@abc中x的bugfoot正在读取字符a、b、c。对于一个列表['abc'],它是不同的,因为只有一个项目。它将iterable的内容转换成一个集合。如果iterable是一个列表,那么它将从列表中的每个元素创建一个集合。这同样适用于字符串@Bugfoot,因此它不是点而是任何多字符字符串。。。相应地修改了标题。@bugfoot您可以打开REPL并键入set'abc'以帮助更好地理解。