我有一个python教程问题,我无法通过。问题如下:
结束
给定两个字符串,如果其中一个字符串出现在另一个字符串的最末端,则返回True,忽略大小写差异(换句话说,计算不应该是“区分大小写”)。
我的解决方案:
def end_other(a,b):
s1=a.lower()
s2=b.lower()
if len(s1)>len(s2):
if s1[-len(s2)]==s2[-len(s2)]:
return True
if len(s1)<len(s2):
if s1[-len(s1)]==s2[-len(s1)]:
return True
if len(s1)==len(s2):
if s1[-len(s1)]==s2[-len(s2)]:
return True
else:
return False
但错误消息窗口显示:所有公共测试都已通过,但某些私有测试失败。您需要概括解决方案。
我的解决方案有什么问题?还是我错过了一些事情?
答案 0 :(得分:16)
使用python的内置str.endswith()
方法怎么样?
def end_other(a, b):
a_lower = a.lower()
b_lower = b.lower()
return a_lower.endswith(b_lower) or b_lower.endswith(a_lower)
答案 1 :(得分:7)
我认为这是你实际上要做的事情:
def end_other ( a, b ):
a = a.lower()
b = b.lower()
if a == b:
return True
elif len( a ) > len( b ):
return b == a[-len( b ):]
else:
return a == b[-len( a ):]
您的解决方案中存在一些错误:
s1[-len(s2)]
或通常s1[x]
只获得一个字符。所以,如果有的话,你只是比较单个字符,而不是实际的字符序列。您可以通过s[x:y]
将序列拼接出一个字符串(参见手册)。s2[-len(s2)]
,即使使用上面解释的冒号,也没有多大意义。您正在使用自己的长度访问s2
。但由于s2
已经是较小的字符串,您可以将其作为一个整体进行比较。a
更长而不是b
,a
将无法在以后b
缩短或与if ... if ... if ... else
相同的长度。因此,你应该使你的if结构支持。而不是if ... elif ... elif ... else
制作链:if
。然后人们自动知道只有其中一种情况可以适用。x < y
表达式。因为当y < x
和x
都不等于true时,y
等于s1
。s2
长于s1
)且内部if不适用(s2
不以if x: return True else: return False
结尾),那么你已经知道函数应该返回False。因为代码后面的任何其他条件都没有办法说明,所以你应该立即返回False(特别是当有其他代码可能会在以后执行时)。如果您有return x
,那么您可以s1[-len(s1)]==s2[-len(s2)]
。s1
:正如已经说过的那样,当s2
和len( "" ) = 0
为空字符串时,您会遇到问题。 str.endswith
如果两个字符串都为空,则两个长度都相同。然后你的代码尝试在空字符串上使用索引范围,这将始终失败(因为没有单个字符)。相反,当你已经知道两个字符串具有相同的大小时,只需将它们作为一个整体进行比较。这也有助于防止空字符串。无论如何,如果你不需要自己实现它,你应该真的使用{{1}}。
答案 2 :(得分:2)
使用空字符串进行比较会崩溃。而是使用.endswith()
。
答案 3 :(得分:1)
def ends_with(str1, str2):
str1 = str1.lower()
str2 = str2.lower()
return str1.endswith(str2) or str2.endswith(str1)
答案 4 :(得分:0)
您的代码的问题是只比较每个字符串中的一个字符。您可能想要使用切片表示法,但是您将结肠留在括号中。例如,您的代码将为“--- ba”和“bc”赋予真实。然后,当len(s1)!= len(s2)时,你不返回False;但是,Python函数总是返回一些东西,并且默认为None,因此错误可能在一段时间内未被检测到(因为None评估为falsy)。
def either_endswith_lower(a, b):
n = min(len(a), len(b))
return a[-n:].lower() == b[-n:].lower()
这是你正在关注的教程,但我更喜欢在函数中删除小写,并让用户调用func(a.lower(),b.lower()),如果这是他们想要的。
答案 5 :(得分:0)
确实,ThiefMaster的回答是最优雅的。
现在只是为了修复你的代码,考虑到poke的评论:
def end_other(a,b):
s1=a.lower()
s2=b.lower()
if len(s1)>len(s2):
if s1[-len(s2):]==s2:
return True
elif len(s1)<len(s2):
if s1==s2[-len(s1):]:
return True
else:
return s1 == s2;
return False
我只是使用简单的规则来简化它:
if
/ elif
/ else
阻止而不是3 if
s,因为3个案例是相互排斥的s[-len(s):]
相当于s