Python字符串集差
在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
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'以帮助更好地理解。