如何使用Python逻辑来检查回文

我试图用Python来检查回文。 我有的代码是非常强大的。

在我看来,从C到Python的最大的错误就是尝试使用Python来实现C逻辑,这使得事情运行缓慢,而且它并没有充分利用这种语言。

我在这个网站上看到。 search“C风格”,Python没有C风格的循环。 可能已经过时了,但是我认为Python意味着Python有自己的方法。

我试过四处寻找,我找不到最新的(Python 3)的build议。 我怎样才能解决在Python中的回文挑战,而不使用for循环?

我在课堂上用C语言完成了这个工作,但是我想用Python来完成。 问题是从欧拉工程 ,伟大的网站顺便说一句,。

 def isPalindrome(n): lst = [int(n) for n in str(n)] l=len(lst) if l==0 || l==1: return True elif len(lst)%2==0: for k in range (l) ##### else: while (k<=((l-1)/2)): if (list[]): ##### for i in range (999, 100, -1): for j in range (999,100, -1): if isPalindrome(i*j): print(i*j) break 

我在这里错过了很多代码。 这五个哈希值只是提醒自己。

具体问题:

  1. 在C中,我会做一个for循环比较索引0和索引max,然后用max-1索引0 + 1,直到某事。 如何在Python中做到最好?

  2. 我的循环(在范围内(999,100,-1),这是一个不好的方法来做到这一点在Python?

  3. 有没有人对我的职位有任何好的build议,好的网站或资源? 我不是一个程序员,我不渴望成为一名程序员,我只是想学到足够的东西,所以当我写我的学士学位论文(电气工程)时,我不需要同时学习一种适用的编程语言在项目中取得好成绩。 “如何从基本的C到Python的伟大的应用”,这样的事情。

  4. 任何具体的代码,以解决这个问题的一个很好的解决scheme也将不胜感激,我需要学习好的algorithm..我想象3种情况。 如果值是零或单个数字,如果它是奇数长度,并且如果它的长度是偶数。 我打算写循环…

PS:问题是:find两个3位整数也是回文的最高价值的产品。

确定给定值是回文的一种pythonic方法:

 str(n) == str(n)[::-1] 

说明:

  • 我们正在检查n的string表示是否等于n的反转string表示
  • [::-1]切片负责反转string
  • 之后,我们使用==比较相等性

相当不直观的[::-1]语法的替代方法是:

 >>> test = "abcba" >>> test == ''.join(reversed(test)) True 

reversed函数返回test字符的反转序列。

''.join()再次将这些字符连接在一起,没有任何内容。

Python的真棒部分是你可以用它做的事情。 您不必使用string的索引。

以下将工作(使用切片)

 def palindrome(n): return n == n[::-1] 

它所做的只是颠倒n,并检查它们是否相等。 n[::-1]反转n(-1表示递减)

“2)我的for循环(在范围内(999,100,-1),这是一个不好的方法来做到这一点在Python?

关于上面的问题,你想使用xrange而不是range(因为range会创build一个实际的列表,而xrange是一个快速的生成器)

我对问题的看法3

我在Python之前学习了C语言,并且只是阅读了文档,并使用控制台进行了操作。 (并通过做项目欧拉问题以及:)

只是为了logging,对于那些正在寻找更多algorithm的方法来validation给定的string是否是回文,有两种方法可以达到相同的效果(使用whilefor循环):

 def is_palindrome(word): letters = list(word) is_palindrome = True i = 0 while len(letters) > 0 and is_palindrome: if letters[0] != letters[(len(letters) - 1)]: is_palindrome = False else: letters.pop(0) if len(letters) > 0: letters.pop((len(letters) - 1)) return is_palindrome 

而…第二个:

 def is_palindrome(word): letters = list(word) is_palindrome = True for letter in letters: if letter == letters[-1]: letters.pop(-1) else: is_palindrome = False break return is_palindrome 

下面的代码将打印0,如果它是回文否则它将打印-1

优化的代码

 word = "nepalapen" is_palindrome = word.find(word[::-1]) print is_palindrome 

输出: 0

 word = "nepalapend" is_palindrome = word.find(word[::-1]) print is_palindrome 

输出: -1

阐释:

searchstring时,返回的值是string开头的位置的值。

所以当你做word.find(word[::-1])nepalapen在位置0处findnepalapen ,而[::-1]反转nepalapen并且在位置0处仍然是nepalapen ,所以返回0

现在,当我们searchnepalapend ,然后反向nepalapenddnepalapen它呈现一个FALSE语句nepalapend被逆转为dnepalapen导致search无法findnepalapend导致值-1 ,这表明string未find。


另一种方法如果回文是打印错误,则打印为

 word = "nepalapen" print(word[::-1]==word[::1]) 

输出: TRUE

还有一个function方法:

 def is_palindrome(word): if len(word) == 1: return True if word[0] != word[-1]: return False return is_palindrome(word[1:-1]) 

我知道这个问题刚才已经回答了,我为这个入侵道歉了。 不过,我正在研究python的这种做法,我只是想分享一下我在做的方式如下,

 word = 'aibohphobia' word_rev = reversed(word) def is_palindrome(word): if list(word) == list(word_rev): print'True, it is a palindrome' else: print'False, this is''ta plindrome' is_palindrome(word) 

我刚刚find了更简单的方法。 这只是一条线。

 is_palindrome = word.find(word[::-1]) 

这里是一个不区分大小写的函数,因为上面的所有解决scheme都区分大小写

 def Palindrome(string): return (string.upper() == string.upper()[::-1]) 

这个函数将返回一个布尔值。

为Python做Watterloo课程,同样的问题被提出作为“Lesseon”在这里find信息:

http://cscircles.cemc.uwaterloo.ca/13-lists/

作为一个新手,我通过以下方式解决了这个问题:

 def isPalindrome(S): pali = True for i in range (0, len(S) // 2): if S[i] == S[(i * -1) - 1] and pali is True: pali = True else: pali = False print(pali) return pali 

该函数被称为isPalindrome(S)并且需要string“S” 。 返回值默认为TRUE ,对第一个if语句进行初始检查。

之后,for循环运行一半的string长度,以检查位置“i”处的string“S”中的字符与前面和后面的字符是否相同。 如果不是这种情况,函数停止,打印出FALSE并返回false。

Cheers.kg

如果string有大写字母或非字母字符,则函数将所有字符转换为小写字母,并使用正则expression式删除所有非字母字符。最后,recursion地应用回文检查:

 import re rules = [ lambda s: any(x.isupper() for x in s), lambda s: not s.isalpha() ] def is_palindrome(s): if any(rule(s) for rule in rules): s = re.sub(r'[^\w]', '', s).lower() if len(s) < 2: return True if s[0] != s[-1]: return False return is_palindrome(s[1:-1]) string = 'Are we not drawn onward, we few, drawn onward to new era?' print(is_palindrome(string)) 

上面的input的输出为True

也许你可以试试这个:

 list=input('enter a string:') if (list==list[::-1]): print ("It is a palindrome") else: print("it is not palindrome") 

你正在问Python中的回文。 回文可以在string,数字和列表上执行。 但是,我只是发布了一个简单的代码来检查一个string的回文。

 # Palindrome of string str=raw_input("Enter the string\n") ln=len(str) for i in range(ln/2) : if(str[ln-i-1]!=str[i]): break if(i==(ln/2)-1): print "Palindrome" else: print "Not Palindrome" 

真正简单的方法来做到这一点

 word = str(raw_input("")) is_palindrome = word.find(word[::-1]) if is_palindrome == 0: print True else: print False 

如果/这里只是为了看上去很漂亮。 关于回文的问题在亚马逊采访QA

假设一个string的“

 palin = lambda s: s[:(len(s)/2 + (0 if len(s)%2==0 else 1)):1] == s[:len(s)/2-1:-1] # Test palin('654456') # True palin('malma') # False palin('ab1ba') # True 

Reversed会产生一个对象( <reversed object at 0x1041c6410> )。 它不能与string.reversed(a)进行比较。

 word = "<insert palindrome/string>" reverse = word[::-1] is_palindrome = word.find(reverse) print is_palindrome 

这是Udacity comp 101第1章中的一个问题。给回文0赋予-1不是。 它很简单,并且不使用循环。

我写了这个代码:

 word = input("enter: ") word = ''.join(word.split())` for x in range(len(word)): if list(word)[x] == ((list(word)[len(word)-x-1])): if x+1 == len(word): print("its pali") 

它的工作。 它得到的话,然后删除空格,并将其变成一个列表,然后testing第一个字母是否等于最后一个,如果第二个是等于第二个等等。

那么'如果x + 1 == len(word)'意味着由于x从0开始,它变为1,然后对于每一个下一个..等等等等等等它的作品,所以它的作品。

 #compare 1st half with reversed second half # ie 'abba' -> 'ab' == 'ba'[::-1] def is_palindrome( s ): return True if len( s ) < 2 else s[ :len( s ) // 2 ] == s[ -( len( s ) // 2 ):][::-1] 

你可以在Python中使用Deques来检查回文

def palindrome(a_string): ch_dequeu = Deque() for ch in a_string: ch_dequeu.add_rear(ch) still_ok = True while ch_dequeu.size() > 1 and still_ok: first = ch_dequeu.remove_front() last = ch_dequeu.remove_rear() if first != last: still_ok = False return still_ok

class Deque: def __init__(self): self.items = [] def is_empty(self): return self.items == [] def add_rear(self, item): self.items.insert(0, item) def add_front(self, item): self.items.append(item) def size(self): return len(self.items) def remove_front(self): return self.items.pop() def remove_rear(self): return self.items.pop(0)

 import string word = input('Please select a word to test \n') word = word.lower() num = len(word) x = round((len(word)-1)/2) #defines first half of string first = word[:x] #reverse second half of string def reverse_odd(text): lst = [] count = 1 for i in range(x+1, len(text)): lst.append(text[len(text)-count]) count += 1 lst = ''.join(lst) return lst #reverse second half of string def reverse_even(text): lst = [] count = 1 for i in range(x, len(text)): lst.append(text[len(text)-count]) count += 1 lst = ''.join(lst) return lst if reverse_odd(word) == first or reverse_even(word) == first: print(string.capwords(word), 'is a palindrome') else: print(string.capwords(word), 'is not a palindrome') 

“algorithm”方式:

 import math def isPalindrome(inputString): if inputString == None: return False strLength = len(inputString) for i in range(math.floor(strLength)): if inputString[i] != inputString[strLength - 1 - i]: return False return True 

如果你不想使用反向function,还有另一种使用function的方法

 #!/usr/bin/python A = 'kayak' def palin(A): i = 0 while (i<=(A.__len__()-1)): if (A[A.__len__()-i-1] == A[i]): i +=1 else: return False if palin(A) == False: print("Not a Palindrome") else : print ("Palindrome") 

这是一个用户input并检查input是回文的例子:

 name = input("Write your word here: ") input("Press <enter> to check if the word is a palindrome.") if str(name) == str(name)[::-1]: print("True") else: print("False") 

但是,甚至不需要设置if / else语句。 您可以直接打印逻辑比较的结果,如下所示:

 name = input("Write your word here: ") input("Press <enter> to check if the word is a palindrome.") print(str(name) == str(name)[::-1]) 
 #!/usr/bin/python str = raw_input("Enter a string ") print "String entered above is %s" %str strlist = [x for x in str ] print "Strlist is %s" %strlist strrev = list(reversed(strlist)) print "Strrev is %s" %strrev if strlist == strrev : print "String is palindrome" else : print "String is not palindrome" 

这很容易

 #palindrome a=raw_input("enter the word") b=a[::-1] if a==b: print("enter word is palindrome") else:`enter code here` print("not a palindrome") 

谢谢