【问题标题】:Python: Checking for palindrome returns False for some reasonPython:检查回文由于某种原因返回 False
【发布时间】:2013-05-12 18:22:36
【问题描述】:

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

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

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

我正在检查的号码是 906609

【问题讨论】:

  • 为什么不删除flag变量,直接从内部循环返回True/False
  • 我曾经这样做,但我试图看看是什么导致它返回 false,这就是为什么我改变了一些事情,包括这个。
  • 嗯,由于某种原因,现在我更改了它,它起作用了。
  • 我做了上面的为什么还是不行?
  • 您的逻辑已关闭。两个嵌套循环意味着将每个元素相互比较——这不是你想要的。

标签: python palindrome


【解决方案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

【讨论】:

  • 感谢您解释问题。 propeller 的代码有效,但我不明白是什么让它与众不同。
  • @user2240288 因为您的循环是嵌套的,所以您正在相互比较字符。因此,对于外部循环的每次迭代,一旦发现与listnum[j] 不同的字符,内部循环就会与flag = False 中断。因此,您的函数实际上是在检查字符串是否仅包含相等的字符(例如 777777)。
  • @user2240288 尝试通过您的程序的一部分并手动完成所有步骤(在纸上或在文本编辑器中)有助于理解您的代码是如何工作的以及应该改变什么:)跨度>
【解决方案2】:

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

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

print is_palindrome('906609') # True

可能需要解释的唯一部分是joining。之所以有必要,是因为reversed将单词的字母一一返回,所以首先需要将它们重新组合起来。

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

【讨论】:

  • 好吧,word==word[::-1] 会更“容易”。
  • 确实,但''.join(reversed(word)) 只是word[::-1]
  • word[::-1] 也快了 4.3 倍(至少在我使用 32 位 Python 3.3.1 的 Windows 7 PC 上)
【解决方案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])

【讨论】:

    猜你喜欢
    • 2020-03-26
    • 2021-07-06
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多