如何使用Python逻辑检查回文

时间:2013-06-26 22:05:35

标签: python string palindrome

我正在尝试用Python检查回文。我的代码非常for - 循环密集。

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

我在this网站上看到了。搜索“C-style for”,Python没有C风格的循环。可能会过时,但我认为它意味着Python有自己的方法。

我试过四处寻找,我找不到最新的(Python 3)建议。如何在不使用for循环的情况下解决Python中的回文挑战?

我在课堂上用C语言完成了这个,但是我想在Python中以个人为基础。问题来自Euler Project,伟大的网站顺便说一句。

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-1索引0 + 1,直到某事为止。如何在Python中做到最好?

  2. 我的for循环(在范围(999,100,-1)中,这是用Python做错的方法吗?

  3. 对于我这个职位的人,有没有任何好的建议,好的网站或资源?我不是程序员,我不想成为一名程序员,我只想学习足够的知识,这样当我写学士学位论文(电子工程)时,我不必同时学习适用的编程语言。在项目中取得好成绩。 “如何从基本的C转到Python的优秀应用”,那种事情。

  4. 为了解决这个问题,任何特定的代码都可以理解,我需要学习好的算法。我正在设想3种情况。如果值为零或单个数字,如果它是奇数长度,如果它是偶数长度。我打算写一些循环......

  5. PS:问题是:找到两个3位整数的最高值乘积,也是一个回文。

31 个答案:

答案 0 :(得分:167)

确定给定值是否为回文的pythonic方法:

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

说明:

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

答案 1 :(得分:25)

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

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

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

''.join()再次将这些角色连接在一起。

答案 2 :(得分:8)

仅仅是为了记录,对于那些寻找更多算法来验证给定字符串是否为回文的人,有两种方法可以实现相同的目标(使用whilefor循环):< / p>

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

答案 3 :(得分:7)

python的优秀部分是你可以用它做的事情。您不必为字符串使用索引。

以下内容适用(使用切片)

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

它的作用是简单地反转n,并检查它们是否相等。 n[::-1]反转n(-1表示递减)

  

“2)我的for循环(在范围(999,100,-1)中,这是用Python做错的方法吗?”

关于上述内容,您希望使用xrange而不是范围(因为范围将创建实际列表,而xrange是快速生成器)

我对问题3的看法

我在Python之前学过C,我只是阅读文档,并使用控制台玩它。 (以及通过做项目欧拉问题:)

答案 4 :(得分:4)

如果 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

阐释:

搜索字符串时,返回的值是字符串起始位置的值。

因此,当您word.find(word[::-1])时,它会在nepalapen位置找到0[::-1]会在nepalapen处发生反转,而nepalapen位置0位于0 {1}}因此返回nepalapend

现在,当我们搜索nepalapend然后将dnepalapen反转为FALSE时,它会将nepalapend语句dnepalapen反转为nepalapend搜索未能找到-1,导致值word = "nepalapen" print(word[::-1]==word[::1]) ,表示找不到字符串。


如果回文打印错误

{{1}}

<强>输出: 是的

答案 5 :(得分:3)

还有功能性方式:

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

答案 6 :(得分:2)

我知道这个问题已经回答了一段时间,我为入侵而道歉。但是,我正在研究一种在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''t a plindrome'

is_palindrome(word)

答案 7 :(得分:1)

我发现的方法更容易。它只有一行。

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

答案 8 :(得分:0)

#compare 1st half with reversed second half
# i.e. 'abba' -> 'ab' == 'ba'[::-1]

def is_palindrome( s ):
   return True if len( s ) < 2 else s[ :len( s ) // 2 ] == s[ -( len( s ) // 2 ):][::-1]

答案 9 :(得分:0)

def isPalin(checkWord):
    Hsize = len(lst)/2
    seed = 1
    palind=True
    while seed<Hsize+1:
        #print seed,lst[seed-1], lst [-(seed)]
        if(lst[seed-1] != lst [-seed]):
            palind = False
            break
        seed = seed+1
    return palind

lst = 'testset'
print lst, isPalin(lst)    
lst = 'testsest'
print lst, isPalin(lst) 

输出

testset True
testsest False

答案 10 :(得分:0)

您可以在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)

答案 11 :(得分: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')

答案 12 :(得分:0)

“算法”方式:

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

答案 13 :(得分:0)

如果您不想使用反向

,还有另一种使用函数的方法
#!/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")

答案 14 :(得分:0)

递归看起来更漂亮!

def isPalindrome(x):
z = numToList(x)
length = math.floor(len(z) / 2)
if length < 2:
    if z[0] == z[-1]:
        return True
    else:
        return False
else:
    if z[0] == z[-1]:
        del z[0]
        del z[-1]
        return isPalindrome(z)
    else:
        return False

答案 15 :(得分:0)

def is_palindrome(string):
   return string == ''.join([letter for letter in reversed(string)])

答案 16 :(得分:0)

print ["Not a palindrome","Is a palindrome"][s == ''.join([s[len(s)-i-1] for i in range(len(s))])]

这是编写单行代码的典型方式

答案 17 :(得分:0)

def pali(str1):
    l=list(str1)
    l1=l[::-1]
    if l1==l:
        print("yess")
    else:
        print("noo")
str1="abc"
a=pali(str1)
print(a)

答案 18 :(得分:0)

我尝试使用这个:

def palindrome_numer(num):
num_str = str(num)
str_list = list(num_str)
if str_list[0] == str_list[-1]:
    return True
return False

它适用于数字,但我不知道字符串

答案 19 :(得分:0)

我写了这段代码:

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")

它有效。 得到这个词,然后删除空格并将其变成一个列表 然后它测试第一个字母是否等于最后一个字母,如果第二个字母等于最后一个字母,依此类推。

然后,如果x + 1 == len(字)&#39;意味着,因为x从0开始,它变为1,然后是每一个......等等等等等等,它起作用,所以它有效。

答案 20 :(得分:0)

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

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

答案 21 :(得分:0)

假设一个字符串''

{{1}}

答案 22 :(得分:0)

真正简单的方法就是

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

如果/其他只是为了花哨的样子。关于回文的问题是亚马逊对QA的采访

答案 23 :(得分:0)

你在python中要求回文。回文可以在字符串,数字和列表上执行。但是,我刚发布了一个简单的代码来检查字符串的回文。

# 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"

答案 24 :(得分:0)

也许你可以尝试这个:

list=input('enter a string:')

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

答案 25 :(得分:0)

如果字符串有大写或非字母字符,那么函数会将所有字符转换为小写并使用正则表达式删除所有非字母字符,最后它会递归地应用回文检查:

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))

上面输入的输出为True

答案 26 :(得分:0)

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

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),需要字符串“S”。 返回值默认为 TRUE ,以便对第一个if语句进行初始检查。

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

Cheers.kg

答案 27 :(得分:0)

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

def Palindrome(string): 

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

此函数将返回布尔值值。

答案 28 :(得分:-1)

很容易

at my.app.JoinPoint_invoke_N_5164114663869737738_3.invokeNext(JoinPoint_invoke_N_5164114663869737738_3.java) [:]
at my.app.JoinPoint_invoke_N_5164114663869737738_3.invokeJoinpoint(JoinPoint_invoke_N_5164114663869737738_3.java) [:]
at my.app.MyInterceptor$MyInterceptorAdvisor.invoke_N_5164114663869737738(MyInterceptor$MyInterceptorAdvisor.java) [:]
at my.app.MyInterceptor.invoke(MyInterceptor.java) [:]

感谢

答案 29 :(得分:-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"

答案 30 :(得分:-1)

以下是一个用户输入并检查输入是否为回文的示例:

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])