我用doctests创建了一个非常简单的回文检查器。
我遇到了上一次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
答案 0 :(得分:3)
请注意,我讨厌你的变量选择。 onlyletters
与onlyLetters
相反,是的,显然......无论如何。
你没有使用ignorecase
所以它怎么能起作用?
这是一个可能的解决方案:
if ignorecase:
return onlyLetters.lower() == onlyletters.lower()
else:
return onlyLetters == onlyletters
答案 1 :(得分: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
答案 2 :(得分:0)
在降低案件后,我的解决方案是用任何无字母替换任何非字母。
import re
def isPalindrome(s, ignoreCase):
if ignoreCase:
s = s.lower()
onlyLetters = re.sub("[^a-z]+", "", s)
return(onlyLetters == onlyLetters[::-1])