#python #tuples #palindrome
Вопрос:
Итак, я изучаю python из книги, и я нахожусь в разделе ввода/вывода, в котором приведен пример кода, который проверяет наличие палиндромов, но он работает только для слова. После этого он спрашивает, могу ли я улучшить код, если кортеж будет содержать запрещенные символы, чтобы он мог проверить, являются ли предложения типа «Голосуйте, сэр» палиндромами. Я занимаюсь этим уже пару раз и просто не могу понять, как мне это реализовать.
Пример кода:
def reverse(text): return text[::-1] def is_palindrome(text): return text == reverse(text) something = input("Enter text: ") if is_palindrome(something): print("Yes, it is a palindrome") else: print("No, it is not palindrome")
То, что я пытался сделать:
def reverse(text): return text[::-1] def sanitize(text): text = text.lower forbidden = (" ", ".", ",", "!", "?") if forbidden in text: text.replace(forbidden, "") return text something = input("Enter text: ") def is_palindrome(text): text = sanitize(text) return text == reverse(text) if is_palindrome(something): print("Yes, it is a palindrome") else: print("No, it is not palindrome")
Конечно, это неправильно и выдает ошибку, но я пробовал несколько попыток, и я просто не могу понять, я уверен, что ответ действительно прост, но я не могу найти
Комментарии:
1. У
text.lower
тебя забыл()
2. После предложенных изменений он выдает ошибку в операнде in, в которой говорится, что для этого требуется строка, а не кортеж.
3. text.replace не изменяет текст на месте — он возвращает измененную строку. Строки Python неизменяемы. Кроме того, нет смысла преобразовывать только одну из сравниваемых строк в нижний регистр. Вам нужно преобразовать их обоих
4. Я не совсем понимаю второе утверждение, я пытаюсь записать ввод в нижнем регистре, а затем удалить знаки препинания. Должен ли я также преобразовать в нижний регистр в первой функции?
5. Не преобразуйте в нижний регистр в функции очистки. Скорее: верните текст.ниже() == обратный(текст). ниже()
Ответ №1:
Возможно, было бы более эффективно (без использования дополнительных модулей) реализовать такую очистку:
def sanitize(text): forbidden = (" ", ".", ",", "!", "?") tl = [] for c in text: if not c in forbidden: tl.append(c) return ''.join(tl)
Конечно, запрещенной переменной может быть список, кортеж или набор.
Использование понимания списка более сжато, но любая разница в производительности (в любом случае), скорее всего, будет незначительной.
def sanitize(text): return ''.join([c for c in text if c not in (" ", ".", ",", "!", "?")])
Комментарии:
1. Спасибо, это сработало, но я хочу спросить, что вы сделали с tl, заключив его в квадратные скобки, а также, как я мог позаботиться о том, чтобы входные данные содержали верхний регистр?
2. квадратные скобки используются для обозначения списка Python. Добавление в список, скорее всего, будет быстрее, чем восстановление строк
Ответ №2:
Я обнаружил несколько проблем с вашим кодом.
text.lower
следует изменить на text.lower()
. для выполнения итерации следует использовать цикл for forbidden
. И text
должно быть обновлено до text.replace(c, “”)
и c
является ли каждое значение forbidden
. Это должен быть код
def reverse(text): return text[::-1] def sanitize(text): text = text.lower() forbidden = (" ", ".", ",", "!", "?") for c in forbidden: text = text.replace(c, "") return text something = raw_input("Enter text: ") def is_palindrome(text): text = sanitize(text) return text == reverse(text) if is_palindrome(something): print("Yes, it is a palindrome") else: print("No, it is not palindrome")
Комментарии:
1. Это не сработает, если входные данные содержат буквы со смешанным регистром