为什么列表和集合之间的元素检查处理方式不同?
让我举几个例子:
'a' in ['aa']
返回False
'a' in ('aa')
返回True
答案 0 :(得分:3)
当您编写('aa')
时,您只是创建一个字符串,因此in
显然会检查字符并评估为True
。您可以使用
>>> x = ('aa')
>>> print(type(x))
<class 'str'>
如文档tuple syntax所示,为了创建单个元素元组,您需要一个尾随逗号,即('aa',)
。在这种情况下,检查元组内的'a'
将导致False
符合预期。
如果实际上使用
创建一个集合x = set('aa')
这就是我想象的那样,创建一个使用字符串中的唯一字符作为元素的集合,因为您传递的字符串被视为该集合的可迭代元素来自(字符 )。因此,您的设置变为{'a'}
,因此in
将评估为True
。相反,如果您使用set literal syntax
x = {'aa'}
使用您的单个字符串'aa'
创建一个集合,in
将评估为False
。因此,这取决于您如何从'aa'
初始化集合。
>>> set('dog')
{'d', 'g', 'o'}
>>> {'dog'}
{'dog'}
答案 1 :(得分:0)
因为('aa')
不是元组,所以它是字符串。元组创建运算符为,
。
所以在你的用例中,命令'a' in ('aa')
实际检查'aa'字符串中存在的天气'a'字符是什么。
使用元组的等效操作将是'a' in ('aa',)
,这是假的。
查看有关python doc#tuple和implicit line joining的更多信息。