繁体   English   中英

“这是回文!” 或“这不是回文!” 当字符串有空格时不打印。 如何正确解释字符串中的空格?

[英]"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条件中缩进,这意味着它只有在您的输入字符串中有空格时才会起作用。

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

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

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

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

请记住,替换替换给定模式的所有出现。 没有真正需要检查单词中是否有空格 - 只需无条件地进行即可。

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

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

...如果你喜欢单线:

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 循环中做的是比较单词和回文中的字符。 但是,如果单词包含标点符号,即使这样也将失败,因为在这个问题中没有考虑这些。 我建议您删除所有空格和标点符号,并确保所有字符都是小写或全部大写(以便您的函数可以是大写盲)。 然后你可以比较单词和回文中的字符,一旦找到不相等的字符就返回 False,如果没有找到不相等的字符,则返回 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!
    String original = "rA89293cEC@Ar";
           original = original.replaceAll("[^a-zA-Z]","").toLowerCase();
    String originalReverse = new StringBuilder(original).reverse().toString();

    System.out.println(original.equals(originalReverse));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM