使用'in'运算符(Python)进行多值检查

时间:2010-02-22 05:12:02

标签: python

if 'string1' in line: ...

...按预期工作,但如果我需要像这样检查多个字符串怎么办:

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

......似乎没有用。

7 个答案:

答案 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)


  1. 您有这种困惑,因为您不了解逻辑 运算符针对字符串起作用。

    Python将空字符串视为False,将非空字符串视为True。

    正常运行是:

    a和b如果a为True,则返回b,否则返回a。

    a或b如果a为True,则返回a,否则返回b。

    因此,每次您输入非空字符串代替 string1,条件将返回True并继续,这将 导致不良行为。希望对您有所帮助:)。

答案 5 :(得分:0)

使用maplambda

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:

相同,但只需将“所有”替换为“全部”