Многократная проверка значений с использованием оператора «in» (Python) - PullRequest
9 голосов
/ 22 февраля 2010
if 'string1' in line: ...

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

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

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

Ответы [ 6 ]

24 голосов
/ 22 февраля 2010
if any(s in line for s in ('string1', 'string2', ...)):
4 голосов
/ 22 февраля 2010

Если вы прочитаете выражение, как это

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

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

Длинный хэнд способ написать именно это

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

Что немного повторяется, поэтому в этом случае лучше использовать any(), как в ответе Игнасио

1 голос
/ 27 августа 2018

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

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

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

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

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

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

1 голос
/ 22 февраля 2010

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')):.

1 голос
/ 22 февраля 2010
if 'string1' in line or 'string2' in line or 'string3' in line:

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

0 голосов
/ 29 марта 2017

Использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...