Урок про обработку строк и списков даёт всего несколько задач — здесь собраны примеры на все ключевые приёмы: числа из строки, поиск максимума без встроенных функций, работа с пробелами, поиск всех вхождений подстроки и фильтрация по условию. Там, где в исходном задании требовался input(), используется фиксированная строка — так весь код урока можно склеить и запустить одним файлом; в интерактивной версии верните input() самостоятельно.
Пример 1: сумма чисел из строки
Принимаем строку с числами через пробел и выводим сумму. Для автоматической проверки используем фиксированную строку; в интерактивной версии замените её на input().
data = "1 2 3 4 5"
numbers = [int(x) for x in data.split()]
print(f"Сумма чисел: {sum(numbers)}")
Логика: split() разбивает строку по пробелам, int() превращает каждую часть в число, sum() считает сумму.
Пример 2: обратный список
Создаём список чисел из строки и выводим его в обратном порядке.
data = "1 2 3 4 5"
numbers = [int(x) for x in data.split()]
reversed_numbers = numbers[::-1]
print(f"Обратный список: {reversed_numbers}")
Логика: срез [::-1] создаёт новый список с элементами в обратном порядке.
Пример 3: максимальное число без max()
Ищем наибольшее число и его индекс вручную — так же, как под капотом работает встроенный max().
numbers = [3, 12, 8, 22, 9, 25, 6, 23, 8, 7]
max_number = numbers[0]
max_index = 0
for index, number in enumerate(numbers):
if number > max_number:
max_number = number
max_index = index
print("Список чисел:", numbers)
print("Наибольшее число:", max_number)
print("Индекс числа:", max_index)
Логика: max_number — накопитель, начинаем с первого элемента. enumerate() даёт одновременно индекс и значение, поэтому не нужен отдельный счётчик через range(len(numbers)).
Пример 4: перестановка соседних элементов
Меняем местами элементы с индексами 0-1, 2-3 и т.д.
numbers = [1, 2, 3, 4, 5]
for i in range(0, len(numbers) - 1, 2):
numbers[i], numbers[i + 1] = numbers[i + 1], numbers[i]
print(numbers)
Логика: шаг 2 в range() берёт индексы парами (0, 2, 4, ...), а numbers[i], numbers[i + 1] = numbers[i + 1], numbers[i] меняет пару местами без временной переменной. Последний нечётный элемент (если он есть) остаётся на месте — см. Ошибки урока, ошибка 7.
Пример 5: числа и слова
Обрабатываем строку, содержащую слова и целые числа. Числа остаются числами, слова начинаются с заглавной буквы.
text = "apple 42 banana 3 100 orange"
result = []
for item in text.split():
if item.isdigit():
result.append(int(item))
else:
result.append(item.title())
print(f"Изначальная строка: {text}")
print(f"Результат: {result}")
Пример 6: кодирование строки (RLE)
Каждая последовательность одинаковых символов заменяется на символ и количество повторений.
text = "aaaabbc"
encoded = ""
count = 1
for i in range(1, len(text)):
if text[i] == text[i - 1]:
count += 1
else:
encoded += text[i - 1] + str(count)
count = 1
encoded += text[-1] + str(count)
print(f"Закодированная строка: {encoded}")
Пример 7: звёздочки вместо цифр
Перебираем символы и заменяем цифры на *.
text = "My number is 123-456-789"
result = "".join("*" if char.isdigit() else char for char in text)
print(f"Строка: {text}")
print(f"Результат: {result}")
Пример 8: развернуть каждое слово
Порядок слов сохраняется, но каждое слово переворачивается по буквам.
text = "Python is fun"
words = text.split()
reversed_words = []
for word in words:
reversed_words.append(word[::-1])
result = " ".join(reversed_words)
print(f"Строка: {text}")
print(f"Результат: {result}")
Логика: split() без аргумента делит по словам, срез [::-1] переворачивает каждое слово, а " ".join(...) собирает их обратно с одиночными пробелами.
Пример 9: один пробел вместо нескольких
Убираем лишние пробелы внутри строки и по краям.
text = " Hello, World! How are you? "
result = " ".join(text.split())
print(f"Строка: {text!r}")
print(f"Результат: {result!r}")
Логика: split() без аргумента сам склеивает подряд идущие пробелы и отбрасывает пробелы по краям — поэтому " ".join(text.split()) короче, чем цепочка .replace(). Сравните с ошибкой 4 в Ошибки урока: split(" ") с явным аргументом лишние пробелы не убирает.
Пример 10: все позиции подстроки
Находим все вхождения подстроки без учёта регистра, а не только первое.
text = "Banana bAnana baNAna"
substring = "ban"
text_lower = text.lower()
positions = []
start = 0
while True:
position = text_lower.find(substring, start)
if position == -1:
break
positions.append(position)
start = position + 1
print("Строка:", text)
print("Подстрока:", substring)
for position in positions:
print("Позиция:", position)
Логика: find(substring, start) ищет начиная с индекса start и возвращает -1, если не нашёл — на этом условии цикл while останавливается. Без второго аргумента find() всегда находил бы одну и ту же первую позицию — см. Ошибки урока, ошибка 3.
Пример 11: корректные имена
Оставляем только имена, которые состоят из букв и начинаются с заглавной буквы.
names = ["Alice", "bob", "Charlie", "dave", "Eva", "Frank123"]
valid_names = []
for name in names:
if name.isalpha() and name[0].isupper():
valid_names.append(name)
print("Имена с заглавной буквы и без цифр:")
for name in valid_names:
print(name)
Логика: isalpha() отсекает "Frank123" (в нём есть цифры), name[0].isupper() отсекает "bob" и "dave" (начинаются со строчной буквы). Оба условия нужны одновременно — только цифры или только регистр не решают задачу.
[::-1] и множественное присваивание выходят за рамки исходного занятия.
Как запустить в VS Code
- Создайте файл
example.pyв папке урока. - Скопируйте код из примера выше.
- Откройте терминал в VS Code (Ctrl + `).
- Активируйте виртуальное окружение:
venv\Scripts\activate(Windows) илиsource venv/bin/activate(Mac/Linux). - Запустите:
python example.py