使用“in”运算符进行多个值检查(Python)[重复]

问题描述 投票:0回答:8
if 'string1' in line: ...

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

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

...似乎不起作用。

python
8个回答
44
投票
if any(s in line for s in ('string1', 'string2', ...)):

7
投票

如果你读到这样的表达

if ('string1') or ('string2') or ('string3' in line):

问题就很明显了。将会发生的情况是“string1”的计算结果为 True,因此表达式的其余部分被短路。

长手写法是这样的

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

这有点重复,所以在这种情况下最好使用

any()
就像 Ignacio 的答案


2
投票

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')):


2
投票

您之所以感到困惑,是因为您不了解逻辑运算符对于字符串的工作原理。

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

一般:

如果

a and b

 为 True,则 
b
计算为
a
,否则计算为
a

如果

a or b

 为 True,则 
a
计算为
a
,否则计算为
b

因此,每次您输入非空字符串代替

string1
时,条件都会评估为 True。


1
投票
if 'string1' in line or 'string2' in line or 'string3' in line:

这适合您需要做的事情吗?


1
投票

使用

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

0
投票

还有“或”,可以改为“和”。 这些是更具可读性的函数:

如果任何参数位于“inside_of”变量中,则返回 true:

def any_in(inside_of, arguments):
  return any(argument in inside_of for argument in arguments)

如果所有参数都在“inside_of”变量中,则返回 true:

相同,但只需将“any”替换为“all”


-1
投票

您可以使用“设置”方法

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
© www.soinside.com 2019 - 2024. All rights reserved.