我知道有一种方法可以解决这个问题,但是我想要理解为什么这不起作用的基本逻辑。
这是一个非常简单的语句,只有在显示“或list”中的第一个子字符串时,它才返回为True。
for i in list:
if (substring1 or substring2 or substring3) in string:
print(string + " found!")我在这里错过了什么?我认为如果在字符串中找到任何子字符串,则或条件将等于true。如前所述,只有在字符串中找到substring1而没有substring2或substring3时,我才会认为是正确的。
发布于 2014-06-13 19:56:59
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):发布于 2014-06-13 19:56:07
>>> string = 'hello'
>>> s1 = 'he'
>>> s2 = 'll'
>>> s3 = 'o'
>>> (s1 or s2 or s3)
'he'
>>> 'he' in string
True这里的问题是,您首先要评估(s1 or s2 or s3),如果s1不对false进行计算,这将为您提供false。在布尔上下文中,空字符串计算为false。
>>> s1 = ''
>>> (s1 or s2 or s3)
'll'您需要的是s1 in string or s2 in string or s3 in string,如果字符串中至少有一个子字符串,这将返回true。
发布于 2014-06-13 20:03:19
这是因为python使用懒惰的评估..。例如..。
def error():
raise ArithmeticError
print "nothing" or error()将打印"nothing“,因为它的计算结果为True在python代码中不检查错误,这通常会引发错误并阻止脚本继续.
print False or error() #raises error and breaks script
(substring1 or substring2 or substring3) #returns the first true valuehttps://stackoverflow.com/questions/24212925
复制相似问题