На этом шаге мы рассмотрим решения нескольких задач, в которых используется обработка строк.
Приведем несколько примеров решения задач на обработку строк.
Задание 1. Дана строка, состоящая из слов, разделенных пробелами. Определить длину самого короткого слова.
Раскрыть/скрыть решение и комментарии.
Прежде всего приведем текст программы и затем прокомментируем его.
# -*- coding: utf-8 -*- stroka = input("Задайте строку: ") # Разбили строку на слова spisok = stroka.split() flag = True # Первое ли это слово? # Цикл по количеству элементов списка for i in range(len(spisok)): if flag == True: # Если это первое слово... minDl = len(spisok[i]) # ... запоминаем его длину flag = False else: # Слова уже были. Выбираем слово минимальной длины if minDl > len(spisok[i]): minDl = len(spisok[i]) print ("Длина самого короткого слова =", minDl, end=" ")
Дадим еще несколько комментариев к приведенной программе.
Разобъем строку на слова, которые поместим в список. Затем будем искать минимальную длину слова. Найденное значение будет ответом. В качестве начального значения переменной minDl, где будет располагаться длина самого короткого слова, возьмем длину первого слова. Для этого заведем переменную flag, с помощью которой определим, какое слово мы обрабатывам (первое или нет). Когда переменная flag имеет значение True, это означает, что мы работаем с первым словом, и нужно переменной minDl просто присвоить значение длины этого слова, после чего не забыть поменять значение переменной flag на противоположное (False).
Во всех остальных случаях, так как переменная flag имеет значение False, то осуществляется сравнение длины текущего слова со значением переменной minDl, и, если значение этой переменной окажется больше длины текущего слова, то она изменит свое значение на значение длины текущего слова. Результат работы приложения изображен на рисунке 1.
Рис.1. Результат работы приложения
Задание 2. Заменить в самом длинном слове строки буквы 'a' на 'b' и наоборот.
Раскрыть/скрыть решение и комментарии.
Сначала приведем текст программы.
# -*- coding: utf-8 -*- stroka = input("Задайте строку: ") # Разбили строку на слова spisok = stroka.split() # Цикл по словам строки mxDlina = 0 for slovo in spisok: if len(slovo) > mxDlina: # Если длина этого слова больше максимальной... mxDlina = len(slovo) # ... запоминаем его длину и само слово mxSlovo = slovo print ("Самое длиное слово =", mxSlovo, end=" ") print ("\nЕго длина:", mxDlina, end=" ") mxSlovo = mxSlovo.replace("a","\x01") mxSlovo = mxSlovo.replace("b","a") mxSlovo = mxSlovo.replace("\x01","b") print("\nСлово после замены =", mxSlovo, end=" ")
Единственная проблема, которая возникает при решении этой задачи - как реализовать правильно замену, ведь если сначала заменить все буквы 'a' на 'b', а потом 'b' на 'a', то в результате останутся только буквы 'a'. Для того, чтобы этого избежать, нужно сначала заменить, например, все буквы 'a' на какой-нибудь символ (или группу символов), появление которого в строке маловероятно или невозможно. В качестве такой последовательности была выбрана '\x01'. Порядок замены следующий: 'a' меняется на '\x01', 'b' - на 'a' и потом '\x01' - на 'b'.
Конечно, никто не запрещал использовать стандартный алгоритм замены, но сначала нужно преобразовать строку в список символов:
# Разбили слово на буквы и сформировали список spk = list(mxSlovo) # Цикл по буквам слова for i in range(len(spk)): if spk[i] == "a": spk[i] = "b" elif spk[i] == "b": spk[i] = "a" # Собрать из букв слово mxSlovo = "".join(spk);
Приведем полный текст приложения:
# -*- coding: utf-8 -*- # Заменить в самом длинном слове строки буквы 'a' на 'b' stroka = input("Задайте строку: ") # Разбили строку на слова spisok = stroka.split() # Цикл по словам строки mxDlina = 0 for slovo in spisok: if len(slovo) > mxDlina: # Если длина этого слова больше максимальной... mxDlina = len(slovo) # ... запоминаем его длину и само слово mxSlovo = slovo print ("Самое длиное слово =", mxSlovo, end=" ") print ("\nЕго длина:", mxDlina, end=" ") # Разбили слово на буквы и сформировали список spk = list(mxSlovo) # Цикл по буквам слова for i in range(len(spk)): if spk[i] == "a": spk[i] = "b" elif spk[i] == "b": spk[i] = "a" # Собрать из букв слово mxSlovo = "".join(spk); print("\nСлово после замены =", mxSlovo, end=" ")
Результат работы приложения изображен на рисунке 2.
Рис.2. Результат работы приложения
Задание 3. Во введенной строке удалить пробелы между первым и вторым вопросительным знаком (эти знаки в строке есть).
Раскрыть/скрыть решение и комментарии.
Думаем, что приведенных в тексте комментариев будет достаточно для понимания принципа работы программы.
# -*- coding: utf-8 -*- stroka = input("Задайте строку: ") # Ищем первый вопросительный знак voprznak1 = stroka.find("?") # Ищем второй вопросительный знак voprznak2 = stroka.find("?", voprznak1 + 1); # Разделяем строку на три подстроки: s1 = stroka[:voprznak1 + 1] # до 1-го вопр. знака включтительно s2 = stroka[voprznak1 + 1:voprznak2] # между 1-м и 2-м вопр. знаками s3 = stroka[voprznak2:] # начиная со 2-го вопр. знака # Удаляем пробелы s2 = s2.replace(" ", "") # Собираем результат stroka = s1 + s2 + s3 print("\nСтрока после замены:", stroka)
Результат работы программы изображен на рисунке 3.
Рис.3. Результат работы приложения
Задание 4. Вводится строка слов. Вывести слова в обратном порядке.
Раскрыть/скрыть решение и комментарии.
Считаем, что идея решения этой задачи будет понятна из комментариев.
Приведем текст программы.
# -*- coding: utf-8 -*- stroka = input("Задайте строку слов: ") # Разбили строку на слова spisok = stroka.split() # "Перевернули" список spisok.reverse() # "Собрали" список stroka = " ".join(spisok) print("Результат:", stroka)
Результат работы программы изображен на рисунке 4.
Рис.4. Результат работы приложения
Для решения данной задачи был также использован список, который затем был "перевернут" методом reverse(), после чего преобразован в строку методом join().
Со следующего шага мы начнем рассматривать регулярные выражения.