Python: уроки, справочник и задачи

Задачи на строки Python: часть 1

Раздел: Задачи на Python с решениями · Обновлено 31.10.2026

Задачи на строки быстро показывают, насколько уверенно вы владеете циклами, методами строк и словарями. Здесь шесть классических упражнений: проверка палиндрома, удаление знаков препинания, сортировка слов, подсчет гласных, поиск анаграмм и подсчет вхождений символа.

Каждую задачу полезно решить дважды: сначала вручную через цикл, чтобы понять алгоритм, затем коротко, через встроенные средства Python 3.12 и 3.13. Второй вариант собран в новом разделе вместе с проверками на фразах с пробелами, заглавными буквами и буквой ё, на которых простые решения часто ошибаются.

Задачи на строки Python: часть 1
Фото: Spaghettifier / CC BY-SA 4.0, Wikimedia Commons
Содержание статьи
  1. Палиндром в питоне
  2. Удалить знаки препинания python
  3. Алфавитный порядок слов Python
  4. Количество гласных букв в слове
  5. Анаграммы Python
  6. Количество символов в строке python
  7. Короткие решения через встроенные инструменты
    1. Палиндром для целой фразы
    2. Знаки препинания через translate
    3. Сортировка слов без учета регистра
    4. Гласные и анаграммы через Counter
  8. Частые вопросы
    1. Чем casefold() лучше lower() для сравнения строк?
    2. Как посчитать количество слов в строке?
    3. Почему решение через reversed() не работает при сравнении со строкой?
    4. Как найти все позиции символа в строке?

Продолжаем наш цикл практических занятий, сегодня у нас на очереди задачи на строки python. В этой статье, мы разберем несколько практических задач.

Палиндром в питоне

В ходе работы над этой небольшой программой, мы поймем, как можно определить, является ли слово палиндромом или нет. Палиндром - это строка, которая читается одинаково, и спереди и сзади, например слово "Мадам". Для того, что бы хорошо освоить этот материал, вам необходимо знать следующие темы:

Исходный код программы

my_str = 'мадам'
my_str = my_str.casefold()
rev_str = reversed(my_str)
if list(my_str) == list(rev_str):
   print("Строка является палиндромом")
else:
   print("Строка не является палиндромом")

Разбираем код:

  1. В этой программе, мы берем строку, которая хранится в my_str.
  2. Далее используем метод casefold(), для преобразования строки в нижний регистр
  3. Производим реверс строки с помощью метода reversed()
  4. Далее создаем условия, в котором производим сравнение. Перед сравнением упаковываем все в список.

Удалить знаки препинания python

В этом примере, вы научитесь удалять знаки препинания из строки. Логика реализации довольна простая, мы запустим цикл for, и будем проверять каждый символ строки, если символ является пунктуацией, присвоим ему пустой элемент. Для того, что бы хорошо разобраться в этом примере, вам следует знать следующие темы:

  1. Цикл for в Python
  2. Строки Python
  3. if...else оператор

Исходный код программы:

punctuations = '''!()-[]{};:'"\,<>./?@#$%^&*_~'''
my_str = "Привет!!!, Меня зовут ---Алексей."
# my_str = input("Введи строку ")
no_punct = ""
for char in my_str:
   if char not in punctuations:
       no_punct = no_punct + char
print(no_punct)
  1. В самом начале в переменной punctuations , мы определили знаки препинания
  2. Затем переменной my_str присвоили строку
  3. Определяем переменную no_punct, который присваиваем пустую строку
  4. Запускаем цикл, перебираем my_str, если в нем встречается символ пунктуации, заменяем ее на пустую строку

Алфавитный порядок слов Python

В этой программе, мы научимся сортировать слова в алфавитном порядке. Для реализации этой идеи мы воспользуемся циклом for. Для того, что бы хорошо понять работу этой программы, нам необходимо знать следующие темы:

В этом примере, мы наглядно рассмотрим то, как слова можно отсортировать в алфавитном порядке, возможно этот кусок кода, когда нибудь облегчит для вас рутинную задачу.

my_str = "Привет, это пример строки в алфавитном порядке"
#my_str = input("Enter a string: ")
words = [word.lower() for word in my_str.split()]
words.sort()
print("The sorted words are:")
for word in words:
   print(word)
Результат:
Алфавитный порядок:
алфавитном
в
порядке
привет,
пример
строки
это
  1. Переменной my_str присваиваем строку, которую надо отсортировать в алфавитном порядке
  2. С помощью метода split(), мы преобразовываем каждое слово в список слов
  3. Методом sort(), производим сортировку и выводим на печать

Количество гласных букв в слове

В этом примере, мы научимся подсчитывать количество гласных букв в предложении, возможно в будущем, вам понадобиться в какой либо программе реализовать такую штуку. И так, для более четкого понимания, вам необходимо знать следующие темы:

Исходный код:

glasalph = 'аеёиоуэюя'
ip_str = 'Привет, меня зовут Тимур, мне 30 лет, в этом предложении, мы будет считать количество глассных букв?'
ip_str = ip_str.casefold()
count = {}.fromkeys(glasalph,0)
for char in ip_str:
   if char in count:
       count[char] += 1
print(count)
Результат:
{'а': 2, 'е': 8, 'ё': 0, 'и': 6, 'о': 5, 'у': 4, 'э': 1, 'ю': 0, 'я': 1}

Разбор кода:

  1. Объявили переменную glasalph, которой присвоили строку, с гласными буквами
  2. Объявили переменную ip_str, в которой хранится строка, где мы будем искать гласные
  3. Используем метод casefold(), и переводим всю строку в нижний регистр
  4. Используем метод словаря fromkeys(), для построения нового словаря с каждым гласным в качестве ключа, с нулевым значением
  5. Запускаем цикл for, и на каждой итерации смотрим, есть ли символ в ключах словаря, если есть, увеличиваем его значение на 1

Анаграммы Python

В этом практическом примере, мы созданим небольшую программу, которая сможет определить, являются ли две строки анаграммами? Для лучшего понимания этого примера, вам необходимо знать следующие темы:

И так, давайте немного разберемся. Анаграма - это слова состоящие из одних и тех же букв, расположенных в разном порядке. Наша задача, определить, являются ли две строки анаграммами. Как мы можем это сделать? В данном случае, я вижу довольно простой алгоритм.

  1. Привести обе строки в нижний регистр
  2. Отсортировать обе строки и сравнить их
  3. Если обе строки равны, то это анаграмма

Приступаем к коду:

str1 = "Игра"
str2 = "Рига"
# Приводим в нижний регистр
str1 = str1.lower()
str2 = str2.lower()
# Сравниваем длину строк
if(len(str1) == len(str2)):
    # Сортируем обе строки
    sorted_str1 = sorted(str1)
    sorted_str2 = sorted(str2)
    if(sorted_str1 == sorted_str2):
        print(str1 + " и " + str2 + " Являются анаграмой.")
    else:
        print(str1 + " и " + str2 + " не являются анаграмой.")
else:
    print(str1 + " и " + str2 + " не являются анаграмой")

Количество символов в строке python

На самом деле, этот практический пример, довольно простой, и в тоже время эффективный. При работе со строками, мне часто приходится считать количество вхождений символа в строку, я думаю решение этой небольшой задачи, когда нибудь облегчит вам вашу задачу.

Для решения этой задачи, вам необходимо знать следующие темы:

Исходный код:

count = 0
my_string = "Pydocssss.ru"
my_char = "s"
for i in my_string:
    if i == my_char:
        count += 1
print(count)
  1. Мы объявили переменную count, которая будет счетчиком
  2. Переменная my_string, в которой хранится наша строка
  3. Переменная my_char, в которой хранится искомый символ
  4. Запускаем цикл for, перебираем строку, и если в строке есть тот же символ что и в переменной my_char
  5. Переменной count, которая изначально равно 0, добавляем 1, и так до тех пор, пока перебор строки не закончится

Короткие решения через встроенные инструменты

Раздел включает: палиндром для целой фразы, знаки препинания через translate, сортировка слов без учета регистра, гласные и анаграммы через Counter.

Палиндром для целой фразы

Простое сравнение строки с ее разворотом не справится с фразой "А роза упала на лапу Азора" из-за пробелов и регистра. Оставим только буквы и цифры:

def is_palindrome(text: str) -> bool:
    chars = [ch for ch in text.casefold() if ch.isalnum()]
    return chars == chars[::-1]

print(is_palindrome("А роза упала на лапу Азора"))   # -> True
print(is_palindrome("Python"))                       # -> False

Метод isalnum() отбрасывает пробелы, запятые и тире, а casefold() выравнивает регистр. Сравнение двух списков символов работает так же, как сравнение строк, поэтому склеивать их обратно не нужно. Если в тексте встречается буква ё, а в развороте е, добавьте замену replace("ё", "е") перед проверкой. Для очень длинных строк можно сравнивать символы с двух концов и выходить при первом несовпадении, но для обычных задач срез достаточно быстр.

Знаки препинания через translate

import string

table = str.maketrans("", "", string.punctuation + "\u00ab\u00bb\u2014\u2026")
text = "Привет!!! Как дела, Python?"
print(text.translate(table))   # -> Привет Как дела Python

translate() удаляет все символы за один проход и работает быстрее цикла со склейкой строк. Константа string.punctuation содержит только ASCII-знаки, поэтому типографские символы добавлены вручную.

Сортировка слов без учета регистра

words = "Яблоко груша Арбуз банан".split()
print(sorted(words))                     # -> ['Арбуз', 'Яблоко', 'банан', 'груша']
print(sorted(words, key=str.casefold))   # -> ['Арбуз', 'банан', 'груша', 'Яблоко']

Без ключа заглавные буквы идут раньше строчных, потому что сравниваются коды символов. Учтите и особенность буквы ё: ее код больше, чем у я, поэтому слова с ё окажутся в конце. Если это важно, замените ё на е в ключе сортировки.

Гласные и анаграммы через Counter

from collections import Counter

text = "Программирование на Python"
vowels = set("аеёиоуыэюяaeiou")
print(sum(1 for ch in text.casefold() if ch in vowels))   # -> 9

def is_anagram(a: str, b: str) -> bool:
    clean = lambda s: Counter(ch for ch in s.casefold() if ch.isalpha())
    return clean(a) == clean(b)

print(is_anagram("Апельсин", "спаниель"))   # -> True
print(Counter("banana").most_common(2))      # -> [('a', 3), ('n', 2)]

Counter строит словарь вида символ и количество за один проход. Два счетчика равны, только если совпадают все буквы и их количества, поэтому сортировка строк для проверки анаграммы не нужна. Метод most_common() сразу решает задачу о самых частых символах.

ЗадачаЧерез циклВстроенное средство
Палиндромсравнение символов с двух концовсрез [::-1]
Удаление знаковпроверка каждого символаstr.translate()
Частота символовсловарь со счетчикамиcollections.Counter
Вхождения символасчетчик в циклеs.count(ch)

Больше упражнений найдете на странице задачи на строки, часть 2.

Частые вопросы

Ответы на типичные вопросы читателей, которые помогут избежать частых ошибок.

Чем casefold() лучше lower() для сравнения строк?

casefold() выполняет более агрессивное приведение к нижнему регистру и учитывает особые случаи других языков, например немецкая ß превращается в ss. Для сравнения без учета регистра это надежнее, а для русского текста оба метода дают одинаковый результат.

Как посчитать количество слов в строке?

len(text.split()): метод split() без аргументов делит по любым пробельным символам и не создает пустых элементов. Если нужно учесть знаки препинания, предварительно удалите их через translate().

Почему решение через reversed() не работает при сравнении со строкой?

reversed() возвращает итератор, а не строку, поэтому s == reversed(s) всегда ложно. Сравнивайте со срезом s[::-1] или соберите строку через "".join(reversed(s)).

Как найти все позиции символа в строке?

Используйте генератор списка с enumerate(): [i for i, ch in enumerate(s) if ch == "a"]. Метод find() возвращает только первое вхождение.