Python 3.2回文

Python 3.2回文,python,python-3.x,palindrome,Python,Python 3.x,Palindrome,我正在做一些python在线教程,我被一个练习困住了:回文是一个单词,它的拼写前后相同。例如,单词 赛车 是回文:第一个和最后一个字母相同(r),第二个和最后第二个字母相同(a),等等。编写一个函数isAlindrome(S),它以字符串S作为输入,如果字符串是回文,则返回True,否则返回False。 这是我写的代码: def isPalindrome(S): if S[0] == S[-1] return print("True") elif S[

我正在做一些python在线教程,我被一个练习困住了:回文是一个单词,它的拼写前后相同。例如,单词

赛车

是回文:第一个和最后一个字母相同(r),第二个和最后第二个字母相同(a),等等。编写一个函数isAlindrome(S),它以字符串S作为输入,如果字符串是回文,则返回True,否则返回False。 这是我写的代码:

  def isPalindrome(S):
      if S[0] == S[-1]
        return print("True")
      elif S[0] == S[-1] and S[1] == S[-2] :
        return print("True")
      else:
        return print("False")
但是,如果单词是例如sarcas,则输出为increct。因此,我需要对我的代码进行修复,使其适用于任何单词

一个单线解决方案,但O(n)和内存昂贵:

def isPalindrome(word) : return word == word[::-1]
使用相同内存量的O(n/2)解决方案是:

def palindrome(word):
   for i in range(len(word)//2):
         if word[i] != word[-1-i]:
                 return False
   return True
这是@LennartRegebro提到的技巧,是一种单线解决方案,但O(n)和内存昂贵:

def isPalindrome(word) : return word == word[::-1]
def is_palindrome(text):
    text = text.replace(' ', '')
    text = text.casefold()
    if list(text) == list(reversed(text)):
        return True
    else:
        return False
使用相同内存量的O(n/2)解决方案是:

def palindrome(word):
   for i in range(len(word)//2):
         if word[i] != word[-1-i]:
                 return False
   return True
这就是@LennartRegebro提到的技巧

这是我的解决方案

def is_palindrome(text):
    text = text.replace(' ', '')
    text = text.casefold()
    if list(text) == list(reversed(text)):
        return True
    else:
        return False
S = input("Input a word: ")

def isPalindrome(S):
    for i in range(0, len(S)):
        if S[0 + i] == S[len(S) - 1]:
            return "True"
    else:
        return "False"
print(isPalindrome(S))
这是我的解决办法

S = input("Input a word: ")

def isPalindrome(S):
    for i in range(0, len(S)):
        if S[0 + i] == S[len(S) - 1]:
            return "True"
    else:
        return "False"
print(isPalindrome(S))
以下是我的解决方案:

def isPalindrome(S):
    l = len(S)-1
    for i in range(0,l):
        if S[i]!=S[l-i]:
            return False
    return True
以下是我的解决方案:

def isPalindrome(S):
    l = len(S)-1
    for i in range(0,l):
        if S[i]!=S[l-i]:
            return False
    return True

使用递归的另一种方法是:

def isPalindrome(word):
  if len(word) <= 1: return True
  return (word[0] == word[-1]) and isPalindrome(word[1:-1])
def isPalindrome(word):

如果len(word)使用递归的另一种方法是:

def isPalindrome(word):
  if len(word) <= 1: return True
  return (word[0] == word[-1]) and isPalindrome(word[1:-1])
def isPalindrome(word):
如果len(word)试试这个

word='malayalam'
print(word==word[::-1])
试试这个

word='malayalam'
print(word==word[::-1])
这是我的解决方案 S=输入(“输入一个单词:”)

这是我的解决方案 S=输入(“输入一个单词:”)


在Python中检查单词是否为回文的最佳方法如下:

var[::] == var[::-1]
但是,了解Python在执行
var[::-1]
Python内部不知道反向是否会产生相同的字符串。因此,它的编码方式是创建一个新的副本。
因此,当您尝试
var[::1]是var[::-1]
时,您将得到FALSE。

在Python中检查单词是否为回文的最佳方法如下:

var[::] == var[::-1]
但是,了解Python在执行
var[::-1]
Python内部不知道反向是否会产生相同的字符串。因此,它的编码方式是创建一个新的副本。
因此,当您尝试
var[::1]是var[::-1]
时,您将得到错误。

这是致命的错误,但我有一些想法,如果Python是用C实现的。如果

  • 代码
    word[::-1]
    迭代到字符串末尾,以制作一个副本,该副本将降低
    word==word[::-1]
    代码速度和内存效率因素
  • 迭代到单词中间比比较完整的单词更好,因为已经测试了字符-对于奇数单词,中间字母不需要测试
  • 加减法需要谨慎使用
  • 递归很酷(也很有趣),但是使用了很多堆栈(除非使用
    尾部递归进行优化
    …这可能会成为底层代码中的for循环,但不太可能灵活到可以实施代码优化)
  • 位移位通常比除法快
  • 代码如下:

    def isPalindrome(S):
        last = len(S)
        middle = last >> 1
        for i in range(middle):
            last -= 1
            if(S[i] != S[last]):
                return False
        return(True)
    
    
    print("\n".join([str((word, isPalindrome(word))) for word in ["abcdcba", "abcdBba", "abccba", "abcBba", "a", ""]]))
    
    这将产生:

    ('abcdcba', True)
    ('abcdBba', False)
    ('abccba', True)
    ('abcBba', False)
    ('a', True)
    ('', True)
    

    这是致命的,但我有一些想法,如果Python是用C实现的

  • 代码
    word[::-1]
    迭代到字符串末尾,以制作一个副本,该副本将降低
    word==word[::-1]
    代码速度和内存效率因素
  • 迭代到单词中间比比较完整的单词更好,因为已经测试了字符-对于奇数单词,中间字母不需要测试
  • 加减法需要谨慎使用
  • 递归很酷(也很有趣),但是使用了很多堆栈(除非使用
    尾部递归进行优化
    …这可能会成为底层代码中的for循环,但不太可能灵活到可以实施代码优化)
  • 位移位通常比除法快
  • 代码如下:

    def isPalindrome(S):
        last = len(S)
        middle = last >> 1
        for i in range(middle):
            last -= 1
            if(S[i] != S[last]):
                return False
        return(True)
    
    
    print("\n".join([str((word, isPalindrome(word))) for word in ["abcdcba", "abcdBba", "abccba", "abcBba", "a", ""]]))
    
    这将产生:

    ('abcdcba', True)
    ('abcdBba', False)
    ('abccba', True)
    ('abcBba', False)
    ('a', True)
    ('', True)
    

    为什么要使用if语句,您应该尝试使其更具动态性,以便处理任意大小的单词。基本上,将单词一分为二,循环,进行比较,任何错误都会结束循环。如果单词的字符数不均匀,则将单词一分为二是很棘手的。循环比较容易。@Reginald:你忘了描述中的“etc”。你只需要先检查两个和最后两个,你需要检查所有的,不管它有多长。问题是我不知道它有多长,输入的是任何单词。我写了一个函数,可以从一个单词中找到中间字符,但是我没有在这些代码中使用它。为什么要使用if语句,你应该尝试使它更动态,以处理任何大小的单词。基本上,将单词一分为二,循环,进行比较,任何错误都会结束循环。如果单词的字符数不均匀,则将单词一分为二是很棘手的。循环比较容易。@Reginald:你忘了描述中的“etc”。你只需要先检查两个和最后两个,你需要检查所有的,不管它有多长。问题是我不知道它有多长,输入的是任何单词。我编写了一个从单词中查找中间字符的函数,但我在这些代码中没有使用它。第二个解决方案不应该是:len(word)//2?@AndréOriani的代码在Python 2中运行良好,但在Python 3中确实需要
    len(word)//2
    ,因为这将四舍五入为整数。
    range
    函数如果得到一个非整数值,将抛出一个异常,在这种情况下,向下舍入是可以的,因为您不需要检查奇数长度单词的中间字符本身。感谢@Blckknght教授更多关于Python的知识。我从未正式学习过Python。我只是在个人项目中使用它,因为“它绝对是工作的语言”,而且它始终是Python2.x。由于我的背景是C类语言,我错误地认为对于python int/int==int.Reginald,我更新了代码以使用“/”操作符abusing
    zip()