Для кортежа '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)]