Python:出于某种原因,检查回文返回False

Python:出于某种原因,检查回文返回False,python,palindrome,Python,Palindrome,我正在写一个程序,我需要做的一件事就是检查一个数字是否是回文。 出于某种原因,我写的东西不起作用: flag = True for j in range(0, len(listnum)): for t in range(len(listnum) -1, -1, -1): if listnum[j] == listnum[t]: flag = True print "false" else:

我正在写一个程序,我需要做的一件事就是检查一个数字是否是回文。 出于某种原因,我写的东西不起作用:

flag = True
for j in range(0, len(listnum)):
    for t in range(len(listnum) -1, -1, -1):
        if listnum[j] == listnum[t]:
            flag = True
            print "false"
         else:
            flag = False
            print "false"
            break
if flag == True:
    return True
else:
    return False
打印“假”/“真”部分用于调试。 我从我编写的函数中提取了这段代码,这就是为什么它会显示“returntrue/False”


我正在检查的数字是906609

您的函数检查最后一个数字是否与列表中的任何其他数字不同。你想要的可能是:

def palindrome(listnum):
    for j in range(0, len(listnum)):
        t = len(listnum) - j - 1
        if listnum[j] != listnum[t]:
            return False            

    return True

assert palindrome([9,0,6,6,0,9])
assert palindrome("ABBA")
assert palindrome([])
assert palindrome("1")
assert palindrome([1.0, 2, 1])
assert not palindrome("lolz")
assert not palindrome([1,2,3])

函数检查最后一个数字是否与列表中的任何其他数字不同。你想要的可能是:

def palindrome(listnum):
    for j in range(0, len(listnum)):
        t = len(listnum) - j - 1
        if listnum[j] != listnum[t]:
            return False            

    return True

assert palindrome([9,0,6,6,0,9])
assert palindrome("ABBA")
assert palindrome([])
assert palindrome("1")
assert palindrome([1.0, 2, 1])
assert not palindrome("lolz")
assert not palindrome([1,2,3])

这并不是你的代码为什么不工作的答案,但是你可能有兴趣知道有一种更简单的方法来确定一个单词是否是回文。根据定义,回文是一个不会因反转而改变的单词。因此:

def is_palindrome(word):
    return word == ''.join(reversed(word))

print is_palindrome('906609') # True
唯一需要解释的部分是
join
ing。这是必要的,因为
reversed
会逐个返回单词的字母,因此首先需要将它们重新组合在一起


正如在一篇评论中指出的,另一种书写方式是
word==word[::-1]
。它的意思完全相同,但可以说有点神秘。

这并不是为什么代码不起作用的答案,但您可能有兴趣知道,有一种更简单的方法可以确定一个单词是否是回文。根据定义,回文是一个不会因反转而改变的单词。因此:

def is_palindrome(word):
    return word == ''.join(reversed(word))

print is_palindrome('906609') # True
唯一需要解释的部分是
join
ing。这是必要的,因为
reversed
会逐个返回单词的字母,因此首先需要将它们重新组合在一起


正如在一篇评论中指出的,另一种书写方式是
word==word[::-1]
。它的意思完全相同,但可以说有点神秘。

这里的主要问题是for循环的嵌套。看起来您希望在锁定步骤中更新j和t,但实际上您是从j=0开始,然后检查t的所有值。然后j=1,再次检查t的所有值,以此类推

代替嵌套循环,您可以使用循环计数器来跟踪查看单词的距离,然后从中计算j和t。例如

for d in range(len(listnum)/2):
    j = d
    t = len(listnum) - d - 1
    #letter equality check here, return if false

return True

这里的主要问题是for循环的嵌套。看起来您希望在锁定步骤中更新j和t,但实际上您是从j=0开始,然后检查t的所有值。然后j=1,再次检查t的所有值,以此类推

代替嵌套循环,您可以使用循环计数器来跟踪查看单词的距离,然后从中计算j和t。例如

for d in range(len(listnum)/2):
    j = d
    t = len(listnum) - d - 1
    #letter equality check here, return if false

return True


为什么不删除
标志
变量,直接从内部循环返回
/
?我以前是这样做的,但我试着看看是什么导致它返回假,这就是为什么我改变了一些事情,包括这个。嗯,出于某种原因,现在我改变了它,它起作用了。为什么当我做上述事情时它不起作用呢?你的逻辑是错误的。两个嵌套循环意味着将每个元素相互比较-这不是您想要的。为什么不删除
标志
变量,直接从内部循环返回
True
/
False
?我过去经常这样做,但我试着看看是什么导致它返回False,这就是为什么我改变了一些东西,包括这个。嗯,由于某种原因,现在我改变了它,它起作用了。为什么我做上述事情时它不起作用呢?你的逻辑是错误的。两个嵌套循环意味着相互比较每个元素-这不是你想要的。好吧,
word==word[:-1]
会更“容易”。的确,但是
''。join(反向(word))
就是
word[:-1]
word[:-1]也快4.3倍(至少在我使用32位Python 3.3.1的Windows7电脑上是如此,
word==word[:-1]
会更“容易”。的确,但是
'.join(反向(word))
只是
word[::-1]
word[::-1]也快了4.3倍(至少在我使用32位Python 3.3.1的Windows 7 PC上是如此),感谢您解释这个问题。“螺旋桨”中的代码工作正常,但我无法理解它的不同之处。@user2240288因为循环是嵌套的,所以您在相互比较字符。因此,在外部循环的每次迭代中,内部循环一旦找到与
listnum[j]
不同的字符,就会以
flag=False
中断。因此,您的函数实际上是在检查字符串是否只包含相等的字符(例如,
777777
)。@user2240288尝试遍历程序的一部分并手动执行所有步骤(在纸上或文本编辑器中)有助于理解代码的工作方式和应更改的内容:)感谢您解释此问题。“螺旋桨”中的代码工作正常,但我无法理解它的不同之处。@user2240288因为循环是嵌套的,所以您在相互比较字符。因此,在外部循环的每次迭代中,内部循环一旦找到与
listnum[j]
不同的字符,就会以
flag=False
中断。因此,您的函数实际上是在检查字符串是否只包含相等的字符(例如,
777777
)。@user2240288尝试遍历程序的一部分并手动执行所有步骤(在纸上或文本编辑器中)有助于了解代码的工作方式和应更改的内容:)