【问题标题】:"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?“这是回文!”或“这不是回文!”当字符串有空格时不打印。如何正确解释字符串中的空格?
【发布时间】:2022-06-28 08:16:57
【问题描述】:

创建一个程序 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 声明?这有点没有意义,它所做的只是让函数返回None,如果没有空格,你也不需要单独检查每个字符,只需检查反转的字符串是否相等
  • 1) palindrome=reversed(words) 不属于 if 条件。如果单词没有空格,则不会定义您的变量回文。 2)为什么你遍历单词的字母?如果它是回文,您只需要比较单词和回文是否相等? (即使你这样做,我也不明白if len(words)==1 应该做什么?
  • 要点是sys.argv[1] 采用第一个参数,所以如果你写的参数不带引号并且它包含一个空格,它将计为 2 个参数。请参阅我的答案的第一部分。

标签: python debugging palindrome


【解决方案1】:

您的整个代码在第一个 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]))

【讨论】:

  • 你不需要明确检查words中是否有空格,如果没有空格replace不会抛出错误,也不需要迭代颠倒的单词,只需join 它并比较两个单词
  • 我知道,但我尝试写一个相对相似的结构让他与他的代码进行比较,也许这是一个最小的可复制示例,还有更多内容。但我完全同意你的看法!
  • @TitouanL 问题指出“......仅考虑字符串中的字母数字字符”。虽然您的解决方案适用于示例数据,但它不符合这一基本要求,因为您只是删除了逗号和空格。即便如此,奇怪的是,它被接受为最终答案
  • @ArthurKing 是的,自从我发布我的第一个答案以来,这个问题已经被修改了很多次,而且我没有每次都改变它。由于 cmets 发生了很多事情,并且 SmittySmerk 删除了他所有的 cmets,我用完整的解决方案更新了我的答案。
  • @TitouanL 应该是 str.isalnum 以符合 OP 的要求
【解决方案2】:

我不确定您的代码试图实现什么。但是我可以看到您尝试检查单词的长度是否为一,因为那将自动成为回文。该代码应该在循环之外。它可能在您的功能开始时。你应该在 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!

【讨论】:

  • 该功能可以正常工作,只需进行必要的更改以适应您的使用方式; IE。带有命令行参数。
【解决方案3】:

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

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

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

【讨论】:

  • @SmittySmerk 像往常一样,我忘了正确阅读问题。现已编辑
【解决方案4】:
    String original = "rA89293cEC@Ar";
           original = original.replaceAll("[^a-zA-Z]","").toLowerCase();
    String originalReverse = new StringBuilder(original).reverse().toString();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多