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 的答案
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 将空字符串视为 False,将非空字符串视为 True。
一般:
如果a and b
为 True,则
b
计算为 a
,否则计算为 a
。
如果 a or b
为 True,则
a
计算为 a
,否则计算为 b
。
因此,每次您输入非空字符串代替
string1
时,条件都会评估为 True。
if 'string1' in line or 'string2' in line or 'string3' in line:
这适合您需要做的事情吗?
使用
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
还有“或”,可以改为“和”。 这些是更具可读性的函数:
如果任何参数位于“inside_of”变量中,则返回 true:
def any_in(inside_of, arguments):
return any(argument in inside_of for argument in arguments)
如果所有参数都在“inside_of”变量中,则返回 true:
相同,但只需将“any”替换为“all”
您可以使用“设置”方法
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