使用in运算符匹配元组中的项目

时间:2018-08-29 07:08:01

标签: python tuples matching

我试图理解为什么下面的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']

2 个答案:

答案 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'是否等于列表/元组项之一?”。