Проблема с палиндромом — Попытка проверить 2 списка на равенство python3.9

#python-3.x

Вопрос:

Я пишу программу, чтобы проверить, является ли данный пользовательский ввод палиндромом или нет. если это так, программа должна напечатать «Да», если нет «нет». Я понимаю, что эта программа слишком сложна, так как на самом деле мне нужно было только проверить все слово с помощью функции reversed (), но в итоге я сделал ее довольно сложной, разделив слово на два списка, а затем сверив списки друг с другом.

Несмотря на это, мне непонятно, почему последнее условие не возвращает ожидаемое «Да», когда я передаю его «гоночный автомобиль» в качестве входных данных. Когда я печатаю списки в строках 23 и 24, я получаю два одинаковых списка, но затем, когда я сравниваю их в условном выражении, я всегда получаю «Нет», что означает, что они не равны друг другу. кто-нибудь может объяснить, почему это так? Я пытался преобразовать списки в строки, но безуспешно.

 def odd_or_even(a): # function for determining if odd or even  if len(a) % 2 == 0:  return True  else:  return False  the_string = input("How about a word?n") x = int(len(the_string))  odd_or_even(the_string) # find out if the word has an odd or an even number of characters  if odd_or_even(the_string) == True: # if even   for i in range(x):  first_half = the_string[0:int((x/2))] #create a list with part 1  second_half = the_string[(x-(int((x/2)))):x] #create a list with part 2 else: #if odd  for i in range(x):  first_half = the_string[:(int((x-1)/2))] #create a list with part 1 without the middle index  second_half = the_string[int(int(x-1)/2) 1:] #create a list with part 2 without the middle index  print(list(reversed(second_half))) print(list(first_half))  if first_half == reversed(second_half): ##### NOT WORKING BUT DONT KNOW WHY #####  print("Yes") else:  print("No")   

Комментарии:

1. Сравнение списка(перевернутого(second_half)) со списком(first_half) отличается от сравнения first_half с перевернутым(second_half). Первый сравнивает списки строк, в то время как второй сравнивает строку с итерируемой.

2. Ах, спасибо.понял — значит, функция reversed() возвращает повторяющийся результат?

3. Ваши for циклы совершенно бессмысленны, переменная цикла i нигде не используется. Вы также можете сэкономить много беспорядка, если откажетесь от всего int кастинга. При необходимости замените его разделением пола x//y .

Ответ №1:

Несмотря на ваши комментарии first_half и second_half являются подстроками ваших входных данных, а не списками. Когда вы их распечатываете, вы преобразуете их в списки, но при сравнении вы не преобразуете first_half или reversed(second_half) . Таким образом, вы сравниваете строку с итератором (возвращаемым reversed ), который всегда будет ложным.

Таким образом , основное исправление состоит в том, чтобы выполнить преобразование для if , точно так же, как вы делали при распечатке списков:

 if list(first_half) == list(reversed(second_half)):  

Лучшим решением может быть сравнение в виде строк, если в одном из срезов использовать a step -1 , поэтому вам не нужно использовать reversed . Попробуйте second_half = the_string[-1:x//2:-1] (или аналогично, вам, вероятно, нужно настроить четный или нечетный регистр по одному). Или вы можете использовать срез «инопланетный смайлик», чтобы изменить строку после того, как вы вырежете ее из ввода: second_half = second_half[::-1] .

В вашем коде есть еще несколько странностей, таких как for i in range(x) цикл, который перезаписывает все свои результаты, кроме последнего. Просто используйте x - 1 в коде нарезки, и вам вообще не понадобится этот цикл. Вы также звоните int намного чаще , чем вам нужно (если бы вы использовали // вместо / этого, вы могли бы избавиться буквально от всех int звонков).

Комментарии:

1. Спасибо. да — только начал изучать программирование, поэтому все, что я делаю, кажется очень сложным, как только я смотрю на код/решения других людей, но я ценю все отзывы!