列表与字符串转集合后集合减法失效:是预期行为还是Bug?
集合减法对字符串转集合无效是Bug还是预期行为?
当两个变量都是字符串列表时,转成集合后执行减法可以得到预期结果:
>>> A = ['One', 'Two', 'Three', 'Four'] >>> B = ['One'] >>> print(list(set(A) - set(B))) ['Three', 'Two', 'Four']
但如果变量B是单个字符串,直接转成集合后执行减法,结果和原集合一致,看起来像是没生效:
>>> A = ['One', 'Two', 'Three', 'Four'] >>> B = 'One' >>> print(list(set(A) - set(B))) ['One', 'Two', 'Three', 'Four']
结论:这是预期行为,不是Bug
原因在于Python中set()函数处理不同类型输入的逻辑:
- 当传入列表(比如
['One'])时,set()会把列表里的每个元素作为集合的成员,得到{'One'}。 - 当传入字符串(比如
'One')时,set()会把字符串拆分为单个字符的集合,得到{'O', 'n', 'e'}。
原集合set(A)的成员是完整的字符串('One'、'Two'等),和set(B)的单个字符成员没有交集,所以集合减法set(A) - set(B)不会移除任何元素,结果和原集合一致。
正确的处理方式
如果要把单个字符串作为集合的唯一成员,应该用以下两种方式:
- 把字符串放到列表里再转集合:
set([B]) - 使用集合字面量:
{B}
修改后的代码示例:
>>> A = ['One', 'Two', 'Three', 'Four'] >>> B = 'One' >>> print(list(set(A) - {B})) ['Three', 'Two', 'Four']
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

