这个Palindrome功能有什么问题?

时间:2013-11-24 07:23:17

标签: python string

更新: 感谢下面的答案,我现在知道这是函数中的错误,与Python的行为无关。 (我的犯规)我已经改变了标题“在迭代字符串时Python可以跳过空格吗?” “这个功能有什么不对?”所以未来的读者会知道他们在这里找到的答案与函数有关,而不是Python。

我在Python中创建了一个函数,用于确定字符串是否为Palindrome。基本上,它同时从左侧和右侧迭代,并检查是否有任何字符不相等。如果是,则返回False。到达中间后,它会停止迭代并返回True。

def isPalindrome(string):
    l = 0
    r = -1
    while(l < r+2):
        if string[l] != string[r]:
            return False
        l += 1
        r -= 1

    return True

palin = raw_input("Enter string: ")
if(isPalindrome(palin)):
    print "\""+palin+"\"","is a Palindrome."
else:
    print "\""+palin+"\"","isn't a Palindrome."

它有效,但由于某种原因,它还将'pythonnoh ty p'等字符串识别为回文结构。虽然有时这可能是一件好事,但我想知道为什么函数似乎跳过字符串中的空格。它应该返回False,因为''不等于'y',但事实并非如此。

我的代码中是否存在问题,还是Python的行为?

2 个答案:

答案 0 :(得分:4)

string[0]string[-1]进行比较后,lr的值为1-2。由于1 < 0不正确,您的while循环结束。

试试这个:

def isPalindrome(s): return s == s[::-1]

如果要忽略空格,可以稍微扩展一下:

def isPalindrome(s, ignoreSpaces = False):
        if ignoreSpaces:
                s = s.replace(' ', '')
        return s == s[::-1]

print (isPalindrome ('pythonnohtyp') )
print (isPalindrome ('pythonnohtyp', True) )
print (isPalindrome ('pythonnoh ty p') )
print (isPalindrome ('pythonnoh ty p', True) )

答案 1 :(得分:3)

您的while循环似乎有问题。

我添加了一个快速调试语句,并为您运行了一些可以揭示问题的测试。

>>> def isPalindrome(string):
    l = 0
    r = -1
    while(l < r+2):
        if string[l] != string[r]:
            return False
        print "left: %s" %string[l]
        print "right: %s" %string[r]
        l += 1
        r -= 1

    return True

>>> isPalindrome("ono")
left: o
right: o
True
>>> isPalindrome("on o")
left: o
right: o
True
>>> isPalindrome("palindrome")
False
>>> isPalindrome("palinilap")
left: p
right: p
True
>>> isPalindrome("palinalap")
left: p
right: p
True