if 'string1' in line: ...
… works as expected but what if I need to check multiple strings like so:
if 'string1' or 'string2' or 'string3' in line: ...
… doesn’t seem to work.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
if any(s in line for s in ('string1', 'string2', ...)):
Method 2
If you read the expression like this
if ('string1') or ('string2') or ('string3' in line):
The problem becomes obvious. What will happen is that ‘string1’ evaluates to True so the rest of the expression is shortcircuited.
The long hand way to write it is this
if 'string1' in line or 'string2' in line or 'string3' in line:
Which is a bit repetitive, so in this case it’s better to use any() like in Ignacio’s answer
Method 3
if 'string1' in line or 'string2' in line or 'string3' in line:
Would that be fine for what you need to do?
Method 4
or does not behave that way. 'string1' or 'string2' or 'string3' in line is equivalent to ('string1') or ('string2') or ('string3' in line), which will always return true (actually, 'string1').
To get the behavior you want, you can say if any(s in line for s in ('string1', 'string2', 'string3')):.
Method 5
-
You have this confusion Because you don’t understand how the logical
operator works with respect to string.Python considers empty strings as False and Non empty Strings as True.
Proper functioning is :
a and b returns b if a is True, else returns a.
a or b returns a if a is True, else returns b.
Therefore every time you put in a non empty string in place of
string1 the condition will return True and proceed , which will
result in an undesired Behavior . Hope it Helps :).
Method 6
Using map and 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
and high-order function
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
Method 7
also as for “or”, you can make it for “and”.
and these are the functions for even more readablity:
returns true if any of the arguments are in “inside_of” variable:
def any_in(inside_of, arguments): return any(argument in inside_of for argument in arguments)
returns true if all of the arguments are in “inside_of” variable:
same, but just replace “any” for “all”
Method 8
You can use “set” methods
line= ["string1","string2","string3","string4"]
# check any in
any_in = not set(["string1","string2","not_in_line"]).isdisjoint(set(line))
# check all in
all_in = set(["string1","string2"]).issubset(set(line))
print(f"any_in: {any_in}, all_in:{all_in}")
# Results:
# any_in: True, all_in:True
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0