Python教程问题:结束函数

时间:2011-01-24 07:59:50

标签: python

我有一个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  

但错误消息窗口显示:所有公共测试都已通过,但某些私有测试失败。您需要概括解决方案。

我的解决方案有什么问题?还是我错过了一些事情?

6 个答案:

答案 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已经是较小的字符串,您可以将其作为一个整体进行比较。
  • 当你的一个外部ifs匹配某个情况时,其他任何外部情况都无法跟随。例如,如果a 更长而不是ba将无法在以后b缩短或与if ... if ... if ... else相同的长度。因此,你应该使你的if结构支持。而不是if ... elif ... elif ... else制作链:if。然后人们自动知道只有其中一种情况可以适用。
  • 当你这样做时,你也可以不用最后的x < y表达式。因为当y < xx都不等于true时,y等于s1
  • 您还需要更改从函数中返回的方式。截至目前,您在每个外部if情况下都有一个条件退出。现在,如果第一个if情况适用(即s2长于s1)且内部if不适用(s2不以if x: return True else: return False结尾),那么你已经知道函数应该返回False。因为代码后面的任何其他条件都没有办法说明,所以你应该立即返回False(特别是当有其他代码可能会在以后执行时)。如果您有return x,那么您可以s1[-len(s1)]==s2[-len(s2)]
  • s1:正如已经说过的那样,当s2len( "" ) = 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
相关问题