2013-05-12 138 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

相關問題