在运算符中使用以匹配元组中的项目
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在运算符中使用以匹配元组中的项目相关的知识,希望对你有一定的参考价值。
我试图理解为什么下面的in运算符也不匹配并打印(4,'foobar')和('foobar',5)(它匹配其余的)。试图用元组来理解我对in的理解。我试图匹配在元组的任何部分中具有“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']
答案
对于元组,'foo' in x
的意思是“是否有x
的元素等于'foo'
”,而不是“是否有包含x
的'foo'
元素”。
做后者,你可以做类似的事情
any('foo' in y for y in x)
但是,对于一个字符串,'foo' in x
的意思是“'foo'
是x
的子串”。
另外,括号中的单个元素(例如('bar2')
和('foobar')
)不构成元组。要创建元组,通常需要在括号中使用逗号:('bar2',)
和('foobar',)
。这两个元素都匹配,因为它们不是元组并包含正确的子字符串。
如果你正在寻找foo
,bar
和foobar
,而不是barfoo
之类的东西,只需添加额外的or
即可理解:
[x for x in ls if 'foo' in x or 'bar' in x or 'foobar' in x]
你可以通过做类似的事情来概括使用any
search_terms = ('foo', 'bar', 'foobar')
[x for x in ls if any(a in x for a in search_terms)]
另一答案
因为('bar2')不是一个元组,而只是字符串'bar2'(和'bar'在那个字符串中),而('foobar',1)是一个元组,'bar'不是('' foobar',1)。
'in'在列表/元组和单个字符串上的工作方式不同。当应用于字符串时,它会询问“is'foo'是否为子字符串?”。当应用于list / tuple时,它会询问“is'foo'是否等于list / tuple项之一?”。
以上是关于在运算符中使用以匹配元组中的项目的主要内容,如果未能解决你的问题,请参考以下文章