我知道有办法解决这个问题,但我想了解为什么这不起作用的基本逻辑。
这是一个非常简单的语句,只有在"或列表中的第一个子字符串时才会返回True。显示。
for i in list:
if (substring1 or substring2 or substring3) in string:
print(string + " found!")
我在这里缺少什么?如果在字符串中找到任何子字符串,我认为或条件将等于true。如果在字符串中找到substring1而没有substring2或substring3,我只会出现为真。
答案 0 :(得分:5)
substring1 or substring2 or substring3
假设substring1
不是空字符串,则此表达式的计算结果为substring1
,因为substring1
是真实的。然后检查它是否在string
中。其他子串对声明没有影响。
换句话说,在or
之前评估in
,并且or
评估它找到的第一个真值(这称为短路)。您不能以in
方式检查多个子字符串是否在字符串中。
你想:
substring1 in string or substring2 in string or substring3 in string
或者:
substrings = (substring1, substring2, substring3)
if any(s in string for s in substrings):
答案 1 :(得分:3)
>>> string = 'hello'
>>> s1 = 'he'
>>> s2 = 'll'
>>> s3 = 'o'
>>> (s1 or s2 or s3)
'he'
>>> 'he' in string
True
这里的问题是,您首先评估(s1 or s2 or s3)
,如果s1
未评估为s1
,则会false
。在布尔上下文中,空字符串计算为false
:
>>> s1 = ''
>>> (s1 or s2 or s3)
'll'
你想要的是s1 in string or s2 in string or s3 in string
,如果字符串中至少有一个子字符串,这将返回true。
答案 2 :(得分:1)
因为python使用延迟评估...例如......
def error():
raise ArithmeticError
print "nothing" or error()
将打印"没有"因为它在python代码中计算为True不会检查错误,这通常会引发错误并阻止脚本继续...
print False or error() #raises error and breaks script
(substring1 or substring2 or substring3) #returns the first true value
答案 3 :(得分:1)
正确的代码应该是
for i in list:
if (substring1 in i ) or (substring2 in i) or (substring3 in i):
print(i + " found!")
上面的代码可以在有多个值时找到子字符串。
(substring1 or substring2 or substring3)
此表达式将返回括号中非空的第一项。 例如,如果subtring1不为null,则返回substring1的值。 当substring1不为null时,
(substring1 or substring2 or substring3)
等于
substring1
答案 4 :(得分:0)
您可能需要any
:
if any(substr in string for substr in substrs):
# At least one match