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

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',)。这两个元素都匹配,因为它们不是元组并包含正确的子字符串。

如果你正在寻找foobarfoobar,而不是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'不是('' foob​​ar',1)。

'in'在列表/元组和单个字符串上的工作方式不同。当应用于字符串时,它会询问“is'foo'是否为子字符串?”。当应用于list / tuple时,它会询问“is'foo'是否等于list / tuple项之一?”。

以上是关于在运算符中使用以匹配元组中的项目的主要内容,如果未能解决你的问题,请参考以下文章

通过映射匹配元组中的值

如何在打字稿元组中使用扩展运算符?

Python中的元组(Tuple)

在 Python 元组列表中查找重复项

在 Pig 中对元组中的所有字段应用 TRIM()

Python:在元组中存储许多正则表达式匹配?