#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
случае вы никогдаlower
их.
Ответ №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()
.