2013-10-14 39 views
1

所以我最近實現了一個代碼來檢查一個單詞是否是迴文。改善Python迴文代碼

def isPalindrome(): 
    string = input('Enter a string: ') 
    string1 = string[::-1] 
    if string[0] == string[(len(string)-1)] and string[1:(len(string)-2)] == string1[1:(len(string)-2)]: 
      print('It is a palindrome') 
    else: 
     print('It is not a palindrome') 
isPalindrome() 

我想知道是否有人可以給我提示簡化代碼。

編輯 - 如果我要使用語句string == string1作爲迭代函數,我將如何停止無盡的while循環?我需要一個計數來停止while循環嗎?

+1

你覺得'string [:: - 1]'是做什麼的? –

+2

對於像這樣的問題(**工作代碼**在需要審查),http://codereview.stackexchange.com/是一個很好的地方。堆棧溢出是真的意味着代碼不起作用的問題 –

+1

@steve所以你知道,讓你反向的字符串。那你爲什麼需要'if-else'條件?你已經得到了原始的字符串,你已經得到了該字符串的反轉。只是比較它們。 –

回答

5

不需要這樣複雜的條件。你已經有一個反轉的字符串(string[::-1])。

所有你需要做的是:

def isPalindrome(): 
    string1 = input('Enter a string: ') 
    string2 = string[::-1] 
    if string1 == string2: 
     return 'It is a palindrome' 
    return 'It is not a palindrome' 

isPalindrome() 

(順便說一句不使用string作爲變量名這名內置模塊。)

這是更好地返回字符串而不是打印它們。這樣,你的功能將不return None(防止一些東西,可能以後發生)

2

你可以做到這一點的一個班輪:

return "Is a palindrome" if string == string[::-1] else "Not a palindrome" 

示例腳本:

>>> string = "stanleyyelnats" 
>>> print "Is a Palindrome" if string == string[::-1] else "Not a palindrome" 
>>> Is a Palindrome 

你也可以做這個(雖然它較慢):

print "Is a Palindrome" if string == ''.join(reversed(string)) else "Not a palindrome" 

另外,使用raw_input而不是input。因爲input評估。讓我告訴你一個例子:

腳本

inp = input("Evaluate ") 

print inp 

運行

Evaluate "cheese" + "cake" 
cheesecake 
+0

很確定OP是使用python 3雖然 – TerryA

0

請檢查該算法,

def is_palindrome(n): 
    m = len(n)/2 
    for i in range(m): 
     j = i + 1 
     if n[i] != n[-j]: 
     return False 
    return True 

print is_palindrome('malayayalam') 
0

所以,我剛剛進入學習Python和我有一直試圖these exercises,#8。雖然我看到很多這樣的答案正在創造一個新的反向字符串(增加了內存開銷),並比較兩個字符串,我想我可以做這個利用較小的內存:

def is_palindrome(s): 
    l=len(s) 
    list_s=list(s) 
    for i in range(0,l):            
     if(list_s[i] !=list_s[l-i-1]): 
      return False 
    else: 
     return True 

您可以使用打印聲明來驗證。 我所做的只是將第一個索引與最後一個索引進行比較,並將第二個索引與倒數第二個索引進行比較,依此類推。 希望有所幫助。

+0

這是**不正確**!由於'return True',一旦第一個字符與最後一個字符進行比較,該函數立即返回,並且字符串的其餘部分被跳過。我剛剛測試過這個,並且is_palindrome('HelloH')返回True,儘管它顯然不是迴文。 – dtyler

+0

我已經更改了我以前的代碼中的else語句,現在它工作正常。讓我知道如果你仍然認爲這是不正確的。 – user2109202

+0

是的,現在應該可以,我已經刪除了我的downvote。 – dtyler

0

檢查從集合

from collections import Counter 

def is_palindrome(letters): 
    return len([v for v in Counter(letters).values() if v % 2]) <= 1 
0

這裏計數器是另一種解決方案,我想出了:

###Piece of code to find the palindrome#### 
def palindrome(): 
    Palindromee = input("Enter the palindrome \t:") 
    index = 0 
    length = len(Palindromee) 
    while index < length: 
     if Palindromee[0] == Palindromee[-1] : 
       index +=1 
    print ("Palindrome worked as expected")  

palindrome() 
+0

不添加只有代碼,請求 – piotrek1543

+0

絕對是一段​​代碼。儘管有一些解釋,但可能會更有用。 – Trilarion

+0

您的循環僅對輸入字符串中的第一個和最後一個元素進行比較,因爲您已對索引「0」和「-1」進行了硬編碼。絕對是一個錯誤。 – elo80ka

0

簡單的方式來寫回文

a=raw_input("Enter the string : ") # Ask user input 

b= list(a)       # convert the input into a list 

print list(a) 

b.reverse()       # reverse function to reverse the 
             # elements of a list 

print b 

if list(a) == b:      # comparing the list of input with b 

    print("It is a palindrome") 

else: 

    print("It is not a palindrome") 
0

,你可以一試這

DEF迴文(STR1): STR1 = 「夫人」 返回STR1 = STR1 [:: - 1] 打印(迴文(STR1)

答案根據給定

字符串上述返回一個布爾如果是迴文印其他假