Создайте программу 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.
Выходы
Ожидаемый результат: «Это палиндром!»
Фактический вывод: «Это не палиндром!»
1) palindrome=reversed(words)
не относится к условию if. Если в слове нет пробелов, ваш переменный палиндром не будет определен. 2) почему вы перебираете буквы слова? если это палиндром, вам просто нужно сравнить слова и палиндром, чтобы они были равны? (и даже если вы сделаете это таким образом, я не понимаю, что должен делать if len(words)==1
?
Суть в том, что sys.argv[1]
принимает 1-й аргумент, поэтому, если вы напишете свой аргумент без кавычек и он содержит пробел, он будет считаться двумя аргументами. См. 1-ю часть моего ответа.
Весь ваш код имеет отступ в первом условии 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
его и сравнить оба слова
Я знаю, но я пытался написать для него относительно похожую структуру для сравнения с его кодом, может быть, это минимальный воспроизводимый пример, и это еще не все. Но я с вами полностью согласен!
@TitouanL В вопросе говорится: «... учитывайте только буквенно-цифровые символы в строке». Хотя ваше решение работает с демонстрационными данными, оно не соответствует этому важному требованию, поскольку вы удаляете только запятые и пробелы. Тем не менее, как ни странно, это было принято как окончательный ответ.
@ArthurKing да, вопрос пересматривался много раз с тех пор, как я опубликовал свой первый ответ, и я не менял его каждый раз. Поскольку в комментариях много чего происходило и что SmittySmerk удалил все свои комментарии, я обновил свой ответ полным решением.
@TitouanL Должно быть улица isalnum, чтобы соответствовать требованиям ОП.
Имейте в виду, что заменять заменяет вхождения все данного шаблона. Нет необходимости проверять, есть ли в слове пробелы — просто делайте это безоговорочно.
Еще лучше использовать регулярное выражение, чтобы исключить пробелы и знаки препинания.
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 Как обычно, я забыл правильно прочитать вопрос. Отредактировано сейчас
Я не уверен, чего ваш код пытается достичь. Но я вижу, вы пытаетесь проверить, имеет ли слово длину, равную единице, поскольку это автоматически будет палиндромом. Этот код должен выйти наружу для цикла. Это может быть в начале вашей функции. Что вы должны делать внутри цикла 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!
Функция работает нормально, просто внесите необходимые изменения в соответствии с тем, как вы хотите ее использовать; т.е. с аргументами командной строки.
зачем тебе это
if
утверждение? это бессмысленно, все, что он делает, это возвращает функциюNone
, если нет пробелов, также вам не нужно проходить каждый символ по отдельности, просто проверьте, равна ли перевернутая строка