-1

我用文档测试创建了一个非常简单的回文检查器。

我对最后一个 doctest 有问题。它失败并且没有执行ignorecase=True. 我无法弄清楚为什么最后一次测试失败了。

代码:

# This Python file uses the following encoding: utf-8
def isPalindrome(s, ignorecase=False):
    """
    >>> type(isPalindrome("bob"))
    <type 'bool'>
    >>> isPalindrome("abc")
    False
    >>> isPalindrome("bob")
    True
    >>> isPalindrome("a man a plan a canal, panama")
    True
    >>> isPalindrome("A man a plan a canal, Panama")
    False
    >>> isPalindrome("A man a plan a canal, Panama", ignorecase=True)
    True
    """

    # Create an empty string "onlyLetters"
    # Loop over all characters in the string argument, and add each 
    #   character which is a letter to "onlyletters"

    # Reverse "onlyletters" and test if this is equal to "onlyletters"

    #s = ""
    news = ""
    for eachLetter in s:
        if eachLetter.isalpha():
            news += eachLetter
    #print news

    onlyLetters = news
    #print onlyLetters   

    onlyletters = news[::-1]
    #print onlyletters

    if onlyLetters == onlyletters:
        return True
    else:
        return False
4

3 回答 3

3

请注意,我讨厌您的变量选择。是的,是的,显然onlyletters是相反的......无论如何。onlyLetters

你不使用ignorecase它怎么会起作用?

这是一个可能的解决方案:

if ignorecase:
    return onlyLetters.lower() == onlyletters.lower()
else:
    return onlyLetters == onlyletters
于 2013-11-13T12:33:04.047 回答
1

我的 2 美分解决方案:

def is_palindrome(s):
    if s == '':
        return True
    else:
        if s[0] == s[-1]:
            return is_palindrome(s[1:-1])
        else:
            return False

输出:

print is_palindrome('')
#>>> True 
print is_palindrome('abab')
#>>> False 
print is_palindrome('abba')
#>>> True
于 2018-03-04T23:48:17.150 回答
0

我的解决方案是在降低大小写后用任何内容替换任何非字母。

import re
def isPalindrome(s, ignoreCase):
    if ignoreCase: 
       s = s.lower()
    onlyLetters = re.sub("[^a-z]+", "", s)
    return(onlyLetters == onlyLetters[::-1])
于 2013-11-13T12:41:33.743 回答