2013-10-14 236 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)

答案根据给定

字符串上述返回一个布尔如果是回文印其他假