如何使用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
我在这里错过了很多代码。 这五个哈希值只是提醒自己。
具体问题:
-
在C中,我会做一个for循环比较索引0和索引max,然后用max-1索引0 + 1,直到某事。 如何在Python中做到最好?
-
我的循环(在范围内(999,100,-1),这是一个不好的方法来做到这一点在Python?
-
有没有人对我的职位有任何好的build议,好的网站或资源? 我不是一个程序员,我不渴望成为一名程序员,我只是想学到足够的东西,所以当我写我的学士学位论文(电气工程)时,我不需要同时学习一种适用的编程语言在项目中取得好成绩。 “如何从基本的C到Python的伟大的应用”,这样的事情。
-
任何具体的代码,以解决这个问题的一个很好的解决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是否是回文,有两种方法可以达到相同的效果(使用while
和for
循环):
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
,然后反向nepalapend
到dnepalapen
它呈现一个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")
谢谢