if 'string1' in line: ...
...按预期工作,但如果我需要像这样检查多个字符串怎么办:
if 'string1' or 'string2' or 'string3' in line: ...
......似乎没有用。
答案 0 :(得分:24)
if any(s in line for s in ('string1', 'string2', ...)):
答案 1 :(得分:4)
如果你读到这样的表达
if ('string1') or ('string2') or ('string3' in line):
问题变得明显。会发生什么''string1'的计算结果为True,因此表达式的其余部分都是短路的。
编写它的好方法就是这个
if 'string1' in line or 'string2' in line or 'string3' in line:
这有点重复,所以在这种情况下最好像在Ignacio的回答中一样使用any()
答案 2 :(得分:1)
if 'string1' in line or 'string2' in line or 'string3' in line:
这对你需要做的事情会好吗?
答案 3 :(得分:1)
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')):
。
答案 4 :(得分:1)
您有这种困惑,因为您不了解逻辑 运算符针对字符串起作用。
Python将空字符串视为False,将非空字符串视为True。
正常运行是:
a和b如果a为True,则返回b,否则返回a。
a或b如果a为True,则返回a,否则返回b。
因此,每次您输入非空字符串代替 string1,条件将返回True并继续,这将 导致不良行为。希望对您有所帮助:)。
答案 5 :(得分:0)
使用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
答案 6 :(得分:0)
也可以将“或”用作“和”。 这些是具有更高可读性的功能:
如果任何参数在“ inside_of”变量中,则返回true:
def any_in(inside_of, arguments):
return any(argument in inside_of for argument in arguments)
如果所有参数都在“ inside_of”变量中,则返回true:
相同,但只需将“所有”替换为“全部”