我试图理解为什么下面的in运算符也不匹配并打印(4,'foobar')和('foobar',5)(它与其余匹配)。试图使我对元组的理解加深。我试图匹配在元组的任何部分都具有“ foo”或“ bar”或“ foobar”的所有元组。
ls = [(1, 'foo'), ('bar2'), ('foo', 'bar', 3), (4, 'foobar'), ('foobar', 5), ('foobar')]
print [x for x in ls if 'foo' in x or 'bar' in x]
[(1, 'foo'), 'bar2', ('foo', 'bar', 3), 'foobar']
答案 0 :(得分:3)
对于一个元组,'foo' in x
的意思是“是否有x
的元素等于 'foo'
”,而不是“是否有{{1的元素}} 包含 x
”。
要做后者,你可以做类似的事情
'foo'
但是,对于字符串,any('foo' in y for y in x)
的意思是“是'foo' in x
的{{1}}的子字符串”。
此外,括号中的单个元素(例如'foo'
和x
)不会 组成元组。要制作元组,通常需要在括号中加上逗号:('bar2')
和('foobar')
。这两个元素之所以匹配,是因为它们不是元组,并且包含正确的子字符串。
如果您专门针对('bar2',)
,('foobar',)
和foo
,而不是像bar
之类的东西,只需在理解中添加一个额外的foobar
:< / p>
barfoo
您可以通过类似的操作来概括使用or
[x for x in ls if 'foo' in x or 'bar' in x or 'foobar' in x]
答案 1 :(得分:2)
因为('bar2')不是一个元组,而只是字符串'bar2'(并且'bar'在该字符串中),而('foobar',1)是一个元组而'bar'不是一个的('foobar',1)。
'in'在列表/元组和单个字符串上的工作方式不同。当应用于字符串时,它会询问“'foo'是子字符串吗?”。当应用于列表/元组时,它会问“'foo'是否等于列表/元组项之一?”。