Не могу понять, как реализовать кортеж в программе проверки палиндромов

#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. Это не сработает, если входные данные содержат буквы со смешанным регистром