if 'string1' in line: ...
... работает как ожидалось, но что, если мне нужно проверить несколько строк так:
if 'string1' or 'string2' or 'string3' in line: ...
... похоже, не работает.
if 'string1' in line: ...
... работает как ожидалось, но что, если мне нужно проверить несколько строк так:
if 'string1' or 'string2' or 'string3' in line: ...
... похоже, не работает.
if any(s in line for s in ('string1', 'string2', ...)):
Если вы читаете выражение типа
if ('string1') or ('string2') or ('string3' in line):
Проблема становится очевидной. Что произойдет, так это то, что 'string1' оценивает значение True, поэтому остальная часть выражения коротко замкнута.
Длинный способ записи - это
if 'string1' in line or 'string2' in line or 'string3' in line:
Это немного повторяющийся, поэтому в этом случае лучше использовать any()
, как в ответе Ignacio
if 'string1' in line or 'string2' in line or 'string3' in line:
Было бы хорошо, что вам нужно сделать?
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')):
.
У вас есть эта путаница, потому что вы не понимаете, как логично Оператор работает по отношению к строке.
Python рассматривает пустые строки как ложные, а непустые строки как истинные.
Правильное функционирование:
a и b возвращает b, если a равно True, иначе возвращает a.
a или b возвращает a, если a равно True, иначе возвращает b.
Поэтому каждый раз, когда вы помещаете непустую строку вместо string1 условие вернет True и продолжит, что привести к нежелательному поведению. Надеюсь, это поможет :).
Используя 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
также что касается "или", вы можете сделать это для "и". и это функции для еще большей читабельности:
возвращает true, если какой-либо из аргументов находится в переменной "inside_of":
def any_in(inside_of, arguments):
return any(argument in inside_of for argument in arguments)
возвращает true, если все аргументы находятся в переменной "inside_of":
то же самое, но просто замените "любой" на "все"