Цикл for в функции работает только один раз
недавно стал программировать на питоне. Решил сделать задачу на палиндром, цель задачи в том чтобы программа с помощью цикла фор удаляла из списка букв слова одну букву и проверяла получается ли из этого слова палиндром.Почему то цикл работает только одну итерацию и дальше не хочет.Программа немного не доработана.
def OneToPalindrome(obj):
for letter in obj:
popped = obj
popped.pop(obj.index(letter))
revobj = popped[-1::-1]
if revobj == obj:
print('True')
break
else:
revobj.clear()
popped.clear()
#здесь будет счетчик итераций
OneToPalindrome(obj = list(input().lower()))
Ответы (2 шт):
Можно так:
>>> def one_to_palindrome(lst):
for i in range(len(lst)):
lst2 = lst[:]
lst2.pop(i)
if lst2 == lst2[::-1]:
return True
return False
>>> one_to_palindrome(list('aaab'))
True
>>> one_to_palindrome(list('hudsfdsii'))
False
Судя по коду вы предполагаете что popped = obj создаёт копию списка. Это не так: обе переменные ссылаются на один и тот же список. Когда позже вы удаляете символ, исходный список портится, дальнейшая работа не имеет смысла.
Если исправить на popped = obj[:], то будет копирование. Тогда вылезет ошибка в if revobj == obj:. Сравниваются строки разной длинны, равенства не будет никогда.
Если исправить на if revobj == popped:, то заработает. Тогда вылезет ошибка в popped.pop(obj.index(letter)). Всегда будет удалятся первая буква из нескольких одинаковых. Это явно не то что вам нужно.
Можно перебирать индексы вместо букв. Получится что-то такое:
def OneToPalindrome(obj):
for i in range(len(obj)):
popped = obj[:]
popped.pop(i)
revobj = popped[-1::-1]
if revobj == obj:
print('True')
break
else:
revobj.clear()
popped.clear()
#здесь будет счетчик итераций
OneToPalindrome(obj = list(input().lower()))
P.S. Если вы доведете решение до ума, то получится квадратичная сложность. Задачу можно решить намного быстрее, за линейное время.