Сравнение Palindrome не обнаруживает некоторые случаи

#python #python-3.x #algorithm #palindrome

#python #python-3.x #алгоритм #палиндром

Вопрос:

Я хочу напечатать True, если слово / строка является палиндромом. Код считывает текст из текстового файла (используя sys.argv[1]). Я не понимаю, почему он проверяет только первую строку.

текстовый файл:

 racecar
AddE
HmllpH
Was it a car or a cat I saw
Hannah
T can arise in context where language is played wit
Able was I ere I saw Elba
Doc note I dissent A fast never prevents a fatness I diet on cod
  

код:

 import sys
filename = sys.argv[1]

with open(filename, "r") as f:
    text = f.readline().strip().lower()

    while text:
        palindrome = True
        i = 0
        while i < len(text) / 2:
            if text[i] != text[len(text) - 1 - i]:
                palindrome = False
            i  = 1
        if palindrome:
            print(True)
        text = f.readline().strip()
  

вывод:

 True
  

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

1. Только первая строка является палиндромом. В любом случае вы можете использовать text == text[::-1] , чтобы проверить, является ли палиндром

2. Не уверен, имеет ли это какое-либо отношение к этому, но вы можете просто выполнить цикл for text in f: (и удалить и опустить в цикле)

3. Кроме того, ваш код, похоже, работает нормально, но в False случае вы никогда print , и все, кроме первого, являются ложными, поскольку вы никогда не lower их.

Ответ №1:

  1. Почему печатается только первая строка?

Только первая строка является палиндромом с учетом регистра.

  1. Исправление кода:

Некоторое объяснение того, что вы видите:

2.1. Цикл for text in map(str.strip, f) означает, что мы просматриваем f строки файла и применяем str.strip() метод к каждой из них.

2.2. text.upper() преобразовать текст в унифицированный верхний регистр для общего сравнения.

2.3. text_upper[::-1] для обратного текста: странная [::-1] индексная нотация означает, что мы перемещаемся по всем элементам на один шаг назад (следовательно, на -1).

 import sys
filename = 'outfile.txt'

with open(filename, "r") as f:
    for text in map(str.strip, f):
        text_upper = text.upper()
        if text_upper == text_upper[::-1]:
            print(f'{text} is palindrom!')
  

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

1. Как только мы закончим, вы также можете изменить цикл на for text in map(str.strip, f):

2. Не было бы проще заменить последнюю строку на text = f.readline().strip().lower() ? В этом случае вам даже не нужна text_upper переменная.

Ответ №2:

Он проверяет все строки, но только первый случай возвращает True, потому что в других строках нет .lower() . Вам пришлось бы изменить последнюю строку на text = f.readline().strip().lower() .