如何检查一个单词或句子是否是回文?

4

我需要用代码检查一个单词或句子是否为回文,我已经能够检查单词,但是在检查句子方面遇到了问题。这是我的代码,很简短,但我不知道如何添加内容以检查句子是否为回文。我是Python的初学者,已经查看了其他人的代码,但它们对我来说过于复杂了。这是我写的代码:

def is_palindrome(s):
  if s[::1] == s[::-1]:
    return True
  else:
    return False

这是一个句子回文的例子:"Red Roses run no risk, sir, on nurses order."(如果忽略空格和特殊字符)


3
句子回文是什么意思?是指我们忽略空格,将所有字母看作一个大单词吗? - Jean-François Fabre
2
@inspectorG4dget 你确定吗?;) - PM 2Ring
2
尝试去掉所有空格,你的句子就变成了一个单词。 - DejaVuSansMono
1
这是作业吗? - Antoine Pinsard
1
@PM2Ring 对的。去掉空格。toLowerCase(),跳过标点符号。好眼力。 - DejaVuSansMono
显示剩余6条评论
8个回答

8
import string

def is_palindrome(s):
    whitelist = set(string.ascii_lowercase)
    s = s.lower()
    s = ''.join([char for char in s if char in whitelist])
    return s == s[::-1]

3

检查句子是否为回文的算法似乎是:

  1. 删除任何非字母字符
  2. 不区分大小写地比较 new_snew_s[::-1]

您可以通过以下方式执行前者:

import string

valid = set(string.ascii_letters)
result_s = ''.join([ch for ch in original_s if ch in valid])

然后,通过执行以下操作:
result_s.casefold() == result_s.casefold()[::-1]

用以下代码将所有内容整合在一起:
import string

s = "Red roses run no risk, sir, on nurses order"
s2 = "abcba"
s_fail = "blah"

def is_palindrome(s):
    valid = set(string.ascii_letters)
    result_s = ''.join([ch for ch in s if ch in valid])
    cf_s = result_s.casefold()
    return cf_s == cf_s[::-1]

assert(is_palindrome(s))
assert(is_palindrome(s2))
assert(is_palindrome(s_fail))  # throws AssertionError

2
您可以使用过滤器来获取字符串中的字符,例如:
letters = ''.join(c for c in words if c in string.letters)
is_palindrome(letters)

您还需要调用lower将其转换为小写:
def is_palindrome(s):
    s = ''.join(c for c in s if c in string.letters)
    s = s.lower()
    return s == s[::-1]

0

我们需要检查一个字符串的反转是否等于原始字符串,并满足两个额外的要求:

  • 忽略大小写
  • 忽略除字母以外的任何字符

解决方案如下:

  1. 将所有字母转换为相同的大小写(例如小写)
  2. 过滤掉非字母字符
  3. 检查回文条件
    def is_palindrome(s):
        s_lower = s.lower()
        letters = [ch for ch in s_lower if ch.isalpha()]
        return letters == letters[::-1]

1
虽然仅提供代码的答案可能回答了问题,但是通过为您的代码提供上下文、解释代码工作原理的原因以及一些参考文献来进一步阅读,您可以显著提高答案的质量。从[答案]:“简洁是可以接受的,但更详细的解释更好。” - Pranav Hosangadi

0

没有for:

word_pilandrom = str(input("Please enter a word: "))
    new_word=word_pilandrom.lower().replace(" ","")
    if new_word[::1] == new_word[::-1]:
        print("OK")
    else:
        print("NOT")

0

根据标题,这个句子可以被称为两种回文方式:

  1. 单词的顺序应该被颠倒: 创建一个单词列表并检查其颠倒后的列表:

    >>> my_sentence = 'Hello World Hello'
    >>> words = my_sentence.split()
    >>> words == words[::-1]
    True
    
  2. 字符的顺序应该被颠倒: 检查翻转后的字符串:

    >>> my_sentence = 'Hello World Hello'
    >>> my_sentence == my_sentence[::-1]
    False 
    
你想要的是第二种方法,但你的代码应该忽略逗号,和空格。并且它应该不区分大小写。首先使用str.replace()删除空格和逗号,然后使用str.lower()将字符串转换为小写。然后进行反向检查:
>>> my_sentence = 'Red Roses run no risk, sir, on nurses order'
>>> my_sentence = my_sentence.replace(' ', '').replace(',', '').lower()
>>> my_sentence == my_sentence[::-1]
True

问题中的注释说:“is_palindrome(“Red Roses run no risk,sir,on nurses order”)== True”。 - Adam Smith
根据评论更新了答案。 - Moinuddin Quadri

0
如果您所说的回文句是忽略空格,您可以这样做:
is_palindrome(sentence.replace(' ', ''))

1
示例句子有逗号。 - John Kugelman

0
str =input("Enter the word")
s =str.lower()
s1 =s.split(" ")
s2 =s1.join()
s3 =''.join(reversed(s2))
if s2 ==s3 :
   print("Palindrome:")
else :
  print("Not Palindrome:")

这个问题已经有多个答案了。您能否通过编辑您的答案来解释您的答案与其他答案的区别?另外,请注意,仅有代码的答案从长远来看是没有用处的。 - 7uc1f3r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接