Обработка строки по символам
Обработка строки по символам — это последовательный просмотр всех её символов с выполнением действия для каждого символа. Такой приём используют, чтобы подсчитать буквы или цифры, заменить одни символы другими, проверить условие для всей строки и построить новую строку.
Что значит обработать строку по символам
Строка состоит из символов, расположенных в определённом порядке. При переборе строки программа берёт символы один за другим: первый, второй и так далее до последнего. Номер позиции называют индексом. В Python индексы начинаются с нуля, поэтому для строки длины \(n\) допустимы индексы от \(0\) до \(n-1\).
Посимвольная обработка — алгоритм, в котором каждый символ строки последовательно проверяется или преобразуется по заданному правилу.
Перед циклом обычно создают переменную-накопитель. Её значение меняется при обработке очередного символа. Вид накопителя зависит от задачи:
- счётчик увеличивают, если найден нужный символ;
- логическую переменную используют для проверки условия;
- строку-результат постепенно дополняют обработанными символами;
- минимум или максимум обновляют при нахождении лучшего значения.
s = "A1b2C3" count = 0 for ch in s: if ch.isdigit(): count += 1 print(count) # 3
Если условие проверяется независимо для каждого символа, достаточно один раз пройти строку слева направо. Время работы такого алгоритма пропорционально длине строки: \(O(n)\).
Подсчёт символов и групп символов
Для подсчёта заводят счётчик со значением \(0\). При выполнении условия счётчик увеличивается на единицу. Важно проверять именно то свойство, которое указано в условии: равенство символу, принадлежность диапазону или наличие в наборе допустимых символов.
Например, количество гласных можно считать проверкой ch in "аеёиоуыэюя". Если регистр не задан, строку удобно предварительно привести к одному виду методом lower(). Для цифр используют ch.isdigit(), для букв — ch.isalpha(), но в экзаменационных задачах часто надёжнее явно задавать диапазоны или набор символов.
Если требуется подсчитать несколько категорий, используют несколько счётчиков. Один символ может относиться только к одной категории, если проверки записаны через if ... elif .... Если категории могут пересекаться, нужны отдельные независимые if.
Что напечатает программа?
s = "a1b2" k = 0 for ch in s: if ch.isdigit(): k += 1 print(k)
Замена и построение новой строки
Строки в Python неизменяемы: нельзя присвоить новое значение отдельному символу выражением s[i] = .... Поэтому при замене символов создают новую строку. На каждом шаге к ней добавляют либо заменённый символ, либо исходный.
s = "каша" r = "" for ch in s: if ch == "а": r += "о" else: r += ch print(r) # кошо
Для каждой позиции сначала решите, какой символ попадёт в результат. Не изменяйте исходную строку во время перебора: собирайте результат в отдельной переменной.
Если нужно заменить один фиксированный символ, можно использовать replace(), но посимвольный алгоритм лучше показывает логику и позволяет применять сложное условие: заменять только цифры, только символы на чётных позициях или только символы после определённого знака.
Проверка свойств всей строки
Для проверки строки часто требуется ответить «да» или «нет»: содержит ли она хотя бы одну цифру, состоит ли только из букв, встречается ли запрещённый символ. Используют два основных накопителя: флаг или счётчик.
Флаг found сначала равен False. При обнаружении подходящего символа он становится True. После цикла значение флага показывает, встречался ли такой символ хотя бы один раз.
s = "room 42" found = False for ch in s: if ch == " ": found = True print(found) # True
Для проверки условия «все символы подходят» применяют флаг ошибки: сначала считают, что строка правильная, а при первом нарушении меняют значение на False. Можно завершить цикл командой break, если дальнейший просмотр не нужен.
Дана жол. Требуется заменить все цифры символом # и подсчитать количество замен. Обрабатываем строку один раз: проверяем каждый символ, увеличиваем счётчик и добавляем нужный символ в результат.
Пусть дана жол a7bc12. Проследим состояние переменных после каждого шага.
a не является цифрой, поэтому добавляем его без изменения.7 заменяем на # и увеличиваем счётчик.b и c добавляем без изменений.1 заменяем на #.2 также заменяем на #. Получаем окончательный ответ.s = "a7bc12" r = "" k = 0 for ch in s: if ch.isdigit(): r += "#" k += 1 else: r += ch print(r) print(k)
Результат программы: a#bc### и 3. Один цикл одновременно выполняет две независимые операции: строит новую строку и считает заменённые символы. Это безопаснее, чем пытаться повторно искать цифры уже изменённой строки.
1. Счётчик не обнуляют перед циклом. 2. Увеличивают счётчик в ветви else, хотя считать нужно подходящие символы. 3. Забывают добавить в результат символы, которые не заменяются. 4. Пытаются изменить s[i] напрямую. 5. При проверке «все символы» используют флаг найденного, хотя нужен флаг нарушения. 6. Не учитывают регистр: A и a — разные символы.
Практический алгоритм и связь с другими задачами
Перед написанием кода сформулируйте правило обработки одного символа. Затем выберите начальное значение накопителя, выполните перебор и проверьте результат на короткой строке, пустой строке и строке без подходящих символов. Для работы с длиной строки пригодится длина строки, а представление строки как последовательности позиций разобрано на странице жол как массив символов.
Если условие зависит от соседних символов, групп или слов, простого независимого решения уже может быть недостаточно. Тогда переходят к обработке серий, обработке слов или странице о сложной обработке строк. Для удаления и добавления символов полезны отдельные приёмы: удаление символов и добавление символов.
Быстрая проверка
x?Главное
- Посимвольный перебор просматривает строку слева направо, от первого символа до последнего.
- Для подсчёта используют счётчик, для поиска — флаг, для замены — новую строку-результат.
- Строки в Python неизменяемы, поэтому отдельные символы не заменяют присваиванием.
- Один проход по строке обычно имеет сложность \(O(n)\); перед кодированием нужно точно определить правило для бір символа.
- Всегда проверяйте пустую строку, отсутствие подходящих символов и различие регистра.