首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“这是回文!”或者“这不是回文!”字符串有空格时不打印。如何正确解释字符串中的空格?

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

Stack Overflow用户
提问于 2022-03-17 12:10:56
回答 4查看 511关注 0票数 -1

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

问题

当字符串中有空格时,我的代码不是打印回文,而是打印它不是回文,尽管有空格。我在代码中包括了replace()、zip()和reversed(),以说明空格和相反的单词,但它没有打印所需的结果。

,我在代码中遗漏了什么或者做错了什么?

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
test 2 Run python3 palindrome.py 'Ed, I saw Harpo Marx ram Oprah W. aside' and match its output to an expected value.

输出

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-03-17 12:21:07

整个代码在第一个if条件下缩进,这意味着只有当条目字符串中有空格时,它才能工作。

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

代码语言:javascript
复制
python3 palindrome.py hey yeh  # does not work
python3 palindrome.py "hey yeh"   # is supposed to work

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

代码语言:javascript
复制
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]))
票数 0
EN

Stack Overflow用户

发布于 2022-03-17 12:48:21

请记住,替换将替换给定模式的所有事件。没有必要去检查单词中是否有空格,只要无条件地做就行了。

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

代码语言:javascript
复制
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,那么:

代码语言:javascript
复制
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 ')

如果你喜欢一条条线的话,...and:

代码语言:javascript
复制
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 ')
票数 0
EN

Stack Overflow用户

发布于 2022-03-17 12:48:22

我不知道你的代码会达到什么目的。但是我可以看到你试着检查word是否有一个长度,因为那将自动是回文。该代码应该在外部循环。它可能在你的功能开始的时候。在for循环中,您应该做的是比较单词和回文中的字符。但即便如此,如果单词中包含标点符号,也会失败,因为在这个问题上没有考虑到这些标点符号。我建议您删除所有空格和标点符号,并确保所有字符都是小写或大写(以便您的函数可以被大写盲)。然后,您可以比较单词和回文中的字符,在这些字符中,一旦找到不等字符,就返回False;如果没有找到不等字符,则返回True。

然而,我发现这个过程很长时间,所以下面是我做的一个更简单的解决方案(它完全解决了问题):

代码语言:javascript
复制
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")

测试:

代码语言:javascript
复制
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!
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71512070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档