当字符串有空格时,"It's a Palindrome!" 或 "It's not a Palindrome!" 不打印。如何正确考虑字符串中的空格?

"It's a Palindrome!" or "It's not a Palindrome!" are not printing when the string has spaces. How do I properly account for the spaces in a string?

创建一个程序,palindrome.py,它有一个函数,接受一个字符串参数并打印一个句子来指示文本是否为回文。该函数应仅考虑字符串中的字母数字字符,而不依赖于大小写、标点符号或空格。如果字符串是回文,它应该打印:It's a palindrome!但是,如果字符串不是回文,它应该打印:It's not a palindrome!

问题

当字符串中有空格时,我的代码不打印它是否是回文,而是打印它不是回文,尽管有空格。我在我的代码中包含了 replace()、zip() 和 reversed() 来解释空格和颠倒的单词,但它没有打印出想要的结果。

我的代码遗漏了什么或做错了什么?

import sys


def palindrome(words):
    if ' ' in words:
        palindromes = words[::-1]
        if palindromes == words:
            return "It's a palindrome!"
        return "It's not a palindrome!"


print(palindrome(sys.argv[1]))

示例测试用例

测试用例 1

tests 1 Run python3 palindrome.py 'Dennis, Nell, Edna, Leon, Nedra, Anita, Rolf, Nora, Alice, Carol, Leo, Jane, Reed, Dena, Dale, Basil, Rae, Penny, Lana, Dave, Denny, Lena, Ida, Bernadette, Ben, Ray, Lila, Nina, Jo, Ira, Mara, Sara, Mario, Jan, Ina, Lily, Arne, Bette, Dan, Reba, Diane, Lynn, Ed, Eva, Dana, Lynne, Pearl, Isabel, Ada, Ned, Dee, Rena, Joel, Lora, Cecil, Aaron, Flora, Tina, Arden, Noel, and Ellen sinned' and match its output to an expected value.

测试用例 2

test 2 Run python3 palindrome.py 'Ed, I saw Harpo Marx ram Oprah W. aside' and match its output to an expected value.

输出

预期输出:“这是一个回文!”

实际输出:“这不是回文!”

您的整个代码在第一个 if 条件下缩进,这意味着它只有在您的输入字符串中包含 space 时才有效。

最重要的是,您在添加参数时使用引号还是双引号?因为使用 sys.argv[1] 需要第一个参数。

python3 palindrome.py hey yeh  # does not work
python3 palindrome.py "hey yeh"   # is supposed to work

您的代码示例的问题在于,在每个非字母字符中,您只试图处理 space。

def palindrome(words):
    words = ''.join(filter(str.isalnum, words.lower()))

    palindrome = words[::-1]
    if palindrome == words:
            return ("It's a palindrome!")
    return ("It's not a palindrome!")


print(palindrome(sys.argv[1]))

请记住,replace 替换给定模式的 all 次出现。不需要检查单词中是否有空格 - 无条件地检查即可。

更好的是,使用正则表达式来消除空格和标点符号。

import re
def palindrome(s):
    s = re.sub('[^\w]', '', s.lower())
    return "It's a palindrome" if s == s[::-1] else "It's not a palindrome"

如果您不想导入 re 那么:

def palindrome(s):
    s = ''.join(c for c in s.lower() if c.isalnum())
    return "It's {}a palindrome".format('' if s == s[::-1] else 'not ')

...如果您喜欢 one-liners:

def palindrome(s):
    return "It's {}a palindrome".format('' if (s := ''.join(c for c in s.lower() if c.isalnum())) == s[::-1] else 'not ')

我不确定您的代码试图实现什么。但我可以看到您尝试检查单词的长度是否为 1,因为那会自动成为回文。该代码应该在循环之外。它可能在您的函数的开头。你应该在 for 循环内做的是比较单词和回文中的字符。但如果单词包含标点符号,即使这样也会失败,因为在这个问题中没有考虑这些标点符号。我建议您删除所有空格和标点符号,并确保所有字符均为小写或全部为大写(以便您的函数可以不区分大小写)。然后你可以比较单词和回文中的字符,其中你 return 一旦找到不相等的字符就为 False 或 return 如果没有找到不相等的字符则为 True

但是我发现过程很长所以下面是我做的一个更简单的解决方案(完全解决了问题):

def palindrome(words):
    new_word = ""
    
    '''
    Collect alpha numeric characters into new_word
    Spaces are removed and all characters are changed to lower case
    so that capitalisation can be ignored
    '''
    for char in words.replace(" ", "").lower():
        if char.isalnum():
            new_word += char

    # Check if word is a palindrome
    if list(new_word) == list(reversed(new_word)):
        print("It's a palindrome!")
    else:
        print("It's not a palindrome")

测试:

palindrome('Dennis, Nell, Edna, Leon, Nedra, Anita, Rolf, Nora, Alice, Carol, Leo, Jane, Reed, Dena, Dale, Basil, Rae, Penny, Lana, Dave, Denny, Lena, Ida, Bernadette, Ben, Ray, Lila, Nina, Jo, Ira, Mara, Sara, Mario, Jan, Ina, Lily, Arne, Bette, Dan, Reba, Diane, Lynn, Ed, Eva, Dana, Lynne, Pearl, Isabel, Ada, Ned, Dee, Rena, Joel, Lora, Cecil, Aaron, Flora, Tina, Arden, Noel, and Ellen sinned')

Output: It's a palindrome!