Множественные проверки значений с использованием оператора "in" (Python)

if 'string1' in line: ...

... работает как ожидалось, но что, если мне нужно проверить несколько строк так:

if 'string1' or 'string2' or 'string3' in line: ...

... похоже, не работает.

Ответ 1

if any(s in line for s in ('string1', 'string2', ...)):

Ответ 2

Если вы читаете выражение типа

if ('string1') or ('string2') or ('string3' in line):

Проблема становится очевидной. Что произойдет, так это то, что 'string1' оценивает значение True, поэтому остальная часть выражения коротко замкнута.

Длинный способ записи - это

if 'string1' in line or 'string2' in line or 'string3' in line:

Это немного повторяющийся, поэтому в этом случае лучше использовать any(), как в ответе Ignacio

Ответ 3

if 'string1' in line or 'string2' in line or 'string3' in line:

Было бы хорошо, что вам нужно сделать?

Ответ 4

or не ведет себя так. 'string1' or 'string2' or 'string3' in line эквивалентен ('string1') or ('string2') or ('string3' in line), который всегда будет возвращать true (фактически, 'string1').

Чтобы получить нужное поведение, вы можете сказать if any(s in line for s in ('string1', 'string2', 'string3')):.

Ответ 5


  1. У вас есть эта путаница, потому что вы не понимаете, как логично Оператор работает по отношению к строке.

    Python рассматривает пустые строки как ложные, а непустые строки как истинные.

    Правильное функционирование:

    a и b возвращает b, если a равно True, иначе возвращает a.

    a или b возвращает a, если a равно True, иначе возвращает b.

    Поэтому каждый раз, когда вы помещаете непустую строку вместо string1 условие вернет True и продолжит, что привести к нежелательному поведению. Надеюсь, это поможет :).

Ответ 6

Используя map и lambda

a = ["a", "b", "c"]
b = ["a", "d", "e"]
c = ["1", "2", "3"]

# any element in `a` is a element of `b` ?
any(map(lambda x:x in b, a))
>>> True

# any element in `a` is a element of `c` ?
any(map(lambda x:x in c, a)) # any element in `a` is a element of `c` ?
>>> False

и функция высокого порядка

has_any = lambda b: lambda a: any(map(lambda x:x in b, a))

# using ...
f1 = has_any( [1,2,3,] )
f1( [3,4,5,] )
>>> True
f1( [6,7,8,] )
>>> False

Ответ 7

также что касается "или", вы можете сделать это для "и". и это функции для еще большей читабельности:

возвращает true, если какой-либо из аргументов находится в переменной "inside_of":

def any_in(inside_of, arguments):
  return any(argument in inside_of for argument in arguments)

возвращает true, если все аргументы находятся в переменной "inside_of":

то же самое, но просто замените "любой" на "все"