2013-05-12 147 views
0

我想写一个程序,我需要做的事情之一是检查一个数字是否是回文。 出于某种原因,我写不工作:Python:检查回文返回False出于某种原因

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 

打印“假” /“真”的部分是用于调试。 我从我写的函数中取出这段代码,这就是为什么它说“返回True/False”。

我检查数量为906609次

+0

为什么不移除'flag'变量并直接从内部循环中返回'True' /'False'? – Alexey 2013-05-12 09:52:36

+0

我曾经这样做过,但我试图找出是什么导致它返回false,这就是为什么我改变了一些东西,包括这一点。 – user2240288 2013-05-12 09:53:37

+0

嗯,出于某种原因,现在我改变了它,它的工作。 – user2240288 2013-05-12 09:54:28

回答

1

你的功能检查,如果最后一个数字是任何其他列表中的不同。你想要的可能是:

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]) 
+0

是的,一切都正确返回。谢谢你:) – user2240288 2013-05-12 10:08:35

2

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

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

print is_palindrome('906609') # True 

这可能需要解释的唯一部分是join ing。这是必要的,因为reversed会逐个返回单词的字母,所以您首先需要再次将它们放在一起。

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

+2

好吧,'word == word [:: - 1]'会更“容易”。 – georg 2013-05-12 10:08:45

+0

确实,'''.join(reverse(word))'简单地说是'word [:: - 1]' – 2013-05-12 10:09:07

+0

word [:: - 1]也是4.3倍快(至少在我的Windows 7 PC上使用32位Python 3.3.1) – Alexey 2013-05-12 10:14:49

2

这里的主要问题是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 
+0

感谢您解释问题。螺旋桨的代码工作,但我不明白是什么使它不同。 – user2240288 2013-05-12 10:19:00

+0

@ user2240288因为你的循环是嵌套的,所以你要相互比较字符。所以,在外循环的每次迭代中,只要发现一个与listnum [j]不同的字符,内层就会以'flag = False'分隔。所以,你的函数实际上是检查字符串是否只包含相等的字符(例如'777777')。 – Alexey 2013-05-12 10:34:22

+0

@ user2240288试图通过程序的一部分,手动执行所有步骤(在纸上或在文本编辑器中)有助于理解代码如何工作以及应该更改哪些内容:) – Alexey 2013-05-12 10:38:03

相关问题