"Это палиндром!" или "Это не палиндром!" не печатаются, когда в строке есть пробелы. Как правильно учитывать пробелы в строке?

Создайте программу palindrome.py с функцией, которая принимает один строковый аргумент и печатает предложение, указывающее, является ли текст палиндромом. Функция должна учитывать только буквенно-цифровые символы в строке и не зависеть от использования заглавных букв, пунктуации или пробелов. Если строка является палиндромом, она должна вывести: Это палиндром! Однако, если строка не является палиндромом, она должна вывести: Это не палиндром!

Эта проблема

Мой код не печатает, является ли это палиндромом, когда внутри строки есть пробелы, но печатает, что это не палиндром, несмотря на наличие пробелов. Я включил 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, если нет пробелов, также вам не нужно проходить каждый символ по отдельности, просто проверьте, равна ли перевернутая строка

Matiiss 17.03.2022 13:16

1) palindrome=reversed(words) не относится к условию if. Если в слове нет пробелов, ваш переменный палиндром не будет определен. 2) почему вы перебираете буквы слова? если это палиндром, вам просто нужно сравнить слова и палиндром, чтобы они были равны? (и даже если вы сделаете это таким образом, я не понимаю, что должен делать if len(words)==1?

Rabinzel 17.03.2022 13:25

Суть в том, что sys.argv[1] принимает 1-й аргумент, поэтому, если вы напишете свой аргумент без кавычек и он содержит пробел, он будет считаться двумя аргументами. См. 1-ю часть моего ответа.

Titouan L 17.03.2022 13:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
87
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Весь ваш код имеет отступ в первом условии if, что означает, что он будет работать, только если в вашей строке ввода есть пробел.

Кроме того, вы используете кавычки или двойные кавычки, когда добавляете свой аргумент? Потому что использование sys.argv[1] принимает 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 его и сравнить оба слова

Matiiss 17.03.2022 13:22

Я знаю, но я пытался написать для него относительно похожую структуру для сравнения с его кодом, может быть, это минимальный воспроизводимый пример, и это еще не все. Но я с вами полностью согласен!

Titouan L 17.03.2022 13:23

@TitouanL В вопросе говорится: «... учитывайте только буквенно-цифровые символы в строке». Хотя ваше решение работает с демонстрационными данными, оно не соответствует этому важному требованию, поскольку вы удаляете только запятые и пробелы. Тем не менее, как ни странно, это было принято как окончательный ответ.

Lancelot du Lac 17.03.2022 17:31

@ArthurKing да, вопрос пересматривался много раз с тех пор, как я опубликовал свой первый ответ, и я не менял его каждый раз. Поскольку в комментариях много чего происходило и что SmittySmerk удалил все свои комментарии, я обновил свой ответ полным решением.

Titouan L 18.03.2022 09:07

@TitouanL Должно быть улица isalnum, чтобы соответствовать требованиям ОП.

Lancelot du Lac 18.03.2022 09:45

Имейте в виду, что заменять заменяет вхождения все данного шаблона. Нет необходимости проверять, есть ли в слове пробелы — просто делайте это безоговорочно.

Еще лучше использовать регулярное выражение, чтобы исключить пробелы и знаки препинания.

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"

Если вы не хотите импортировать ре, то:

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 Как обычно, я забыл правильно прочитать вопрос. Отредактировано сейчас

Lancelot du Lac 17.03.2022 14:07

Я не уверен, чего ваш код пытается достичь. Но я вижу, вы пытаетесь проверить, имеет ли слово длину, равную единице, поскольку это автоматически будет палиндромом. Этот код должен выйти наружу для цикла. Это может быть в начале вашей функции. Что вы должны делать внутри цикла 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!

Функция работает нормально, просто внесите необходимые изменения в соответствии с тем, как вы хотите ее использовать; т.е. с аргументами командной строки.

Emmanuel 17.03.2022 14:23

Другие вопросы по теме