#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. Спасибо. да — только начал изучать программирование, поэтому все, что я делаю, кажется очень сложным, как только я смотрю на код/решения других людей, но я ценю все отзывы!